自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Gene Xu

个人博客 https://blog.xujun.pro/

原创 欢迎大家访问我的个人博客,请多多关照

GeneXu’s Blog很早之前就有搭建自己博客的想法了,但平常工作、生活、学习占据了大部分时间,导致没有什么时间来搭建博客 ,其实主要是自己太懒了(¬_¬),这次过年疫情期间宅在家里,终于有时间搭建自己的博客了一开始的想法是用 Hexo + GitHub Pages 来搭建,此外 Hexo 的主题众多,挑选一款自己喜欢的就可以了,省时又省力。不过用下来的过程我发现,Hexo 的语法真的不...

2020-04-17 22:59:38 124

原创 Collection -- 02 -- BlockingQueue源码解析

BlockingQueue,即阻塞队列,其继承于 Queue,用于提供可阻塞的入队和出队操作BlockingQueue 主要用于生产者 - 消费者模式,在多线程场景时,生产者线程在队列尾部添加元素,而消费者线程则在队列头部消费元素,通过这种方式能够达到将任务的生产和消费进行隔离的目的一、队列实现ArrayBlockingQueue一个由数组结构组成的有界阻塞队列该队列容量是有有限的,在初始化时,必须指定容量大小,容量大小一旦指定,就无法改变该队列以先进先出 (FIFO) 的方法

2020-07-26 21:11:05 35

原创 Concurrent -- 08 -- Exchanger用法解析

Exchanger,即交换器,是一个同步工具类,用于控制两个线程在同步点处的数据交换Exchanger 提供了一个同步点 (调用 exchange() 方法的地方即为同步点),当一个线程先执行到达同步点后,会被阻塞,直到另一个线程也进入到同步点为止,当两个线程都到达该同步点后,就会进行数据交换举例说明 1ExchangerTest.javapublic class ExchangerTest { public static void main(String[] args) {

2020-07-26 15:48:50 58

原创 Concurrent -- 07 -- Semaphore源码解析

Semaphore,即信号量,是一个同步工具类,用于控制某个资源可被同时访问的线程个数一、内部类解析Syncabstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1192457210091910933L; // Sync 构造方法,初始化许可数目 Sync(int permits) { set

2020-07-26 15:44:23 19

原创 Concurrent -- 06 -- CyclicBarrier源码解析

CyclicBarrier,即循环栅栏,是一个同步工具类,用于阻塞当前线程,等待其他线程,所有线程都必须同时到达栅栏位置后,才可以继续执行当所有线程都达到栅栏位置后,可以触发执行一个预先设置好的任务一、内部类解析Generationprivate static class Generation { // 标记当前代是否损坏 boolean broken = false;}Generation 是 CyclicBarrier 的内部类,用于帮助 CyclicBarrie

2020-07-26 15:27:23 19

原创 Concurrent -- 05 -- CountDownLatch源码解析

CountDownLatch,即倒计时器,是一个同步工具类,用于协调多个线程之间的同步,常用来控制线程等待,它可以让某个线程一直处于等待状态直到倒计时结束后再开始执行一、内部类解析Syncprivate static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; // Sync 构造方

2020-07-25 23:57:50 28

原创 Concurrent -- 04 -- HashMap源码解析(JDK8)

HashMap 是我们日常开发过程中使用的最多的集合类之一,最早出现在 JDK2 中,以 key、value 的形式保存具有映射关系的两个数据 (由 key、value 两个值组成的键值对),其中 key 是不可重复的,value 是可重复的,key 和 value 都可以存放 null,但 key 只能存在一个 null,value 可以存在一个或多个 null简单地了解了 HashMap 后,让我们来深入了解下它的底层实现原理一、数据结构在 JDK8 之前的版本中,HashMap 底层采用.

2020-07-25 17:21:27 79

原创 Official Account -- 03 -- Java微信公众号模板消息

模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等官方文档:模板消息接口一、公共类WXConstants.java/** * 获取access_token接口 * 此处的ACCESS_TOKEN与授权登陆获得的ACCESS_TOKEN不同,有效期为7200s */public static final String GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bi

2020-07-23 18:17:56 44

原创 Official Account -- 02 -- Java微信公众号获取access_token

access_token 是微信公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用 access_tokenaccess_token 的存储至少要保留 512 个字符空间,有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效官方文档:获取Access token一、配置 IP 白名单首先我们需要在微信公众平台上设置 IP 白名单,也就是本机的外网 IP 地址,否则将无法获取 access_token路径:开发 --> 基本配置 -

2020-07-23 18:06:43 46

原创 ThreadLocal -- 03 -- ThreadLocal源码解析

ThreadLocal,用于提供线程局部变量,常用于多线程环境下对非线程安全资源的并发访问,如果我们不想加锁,就可以使用 ThreadLocal 来使得每个线程都持有一个该资源的副本,各个线程之间互不干扰ThreadLocal 与各种锁机制相比,侧重于以空间换时间,来提高并发效率一、内部类解析SuppliedThreadLocal<T>static final class SuppliedThreadLocal<T> extends ThreadLocal<T&g

2020-07-22 11:46:43 30

原创 ThreadLocal -- 02 -- InheritableThreadLocal源码解析

InheritableThreadLocal 继承自 ThreadLocal,用于提供从父线程到子线程值的继承一、方法解析1、childValue(T parentValue) 相关方法childValue(T parentValue)protected T childValue(T parentValue) { return parentValue;}在创建子线程时,根据父线程的值来计算可被继承的局部变量在子线程中的初始值在启动子线程之前,会在父线程中调用此方法,此方

2020-07-22 11:23:45 35

原创 ThreadLocal -- 01 -- ThreadLocal内部类ThreadLocalMap源码解析

ThreadLocalMap 是 ThreadLocal 的内部类,是一个自定义的哈希映射,用于维护线程的局部变量;其方法的访问权限都是私有的,因此只有 ThreadLocal 可以调用 ThreadLocalMap 中的方法,而其他类则不可以;此外其类访问权限是包级别的,也就是同一个包下面的类可以访问 ThreadLocalMap,但是不能调用 ThreadLocalMap 中的方法一、数据结构在 Thread 类中有一个类型为 ThreadLocal.ThreadLocalMap 的变量 th

2020-07-22 10:34:26 39

原创 CoreJava -- 02 -- Java静态代码块、构造代码块、普通代码块的区别以及加载顺序
原力计划

一、静态代码块定义使用 static 进行修饰,定义在类中 (static {}),当类加载的时候执行,且只执行一次一个类中可以存在多个静态代码块,按照定义的先后顺序进行执行当调用类的静态变量或静态方法时,只会执行静态代码块中的代码当创建对象时,静态代码块优先于构造方法执行当创建对象时,静态代码块优先于构造代码块执行举例说明public class CodeBlockTest { static int i; static {

2020-06-22 21:30:38 80

原创 CoreJava -- 01 -- Java静态变量、成员变量、局部变量之间的区别
原力计划

一、静态变量静态变量 (类变量) 使用 static 进行修饰,有默认值,定义在类里,方法体外,存储在方法区中方法区用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据Java 8 之前,方法区的具体实现为永久代;Java 8 开始,方法区的具体实现为元空间永久代使用的是虚拟机的内存;元空间使用的是本地内存静态变量在类加载的时候创建,直到该类被销毁前一直存在,是类级别的变量类的生命周期加载 --> 验证 --> 准备

2020-06-21 19:44:47 122

原创 Collection -- 01 -- Comparable和Comparator的区别
原力计划

在 Java 中,我们可以使用 Comparable 或者 Comparator 来实现两个元素之间比较与排序,现在让我们一起来看看它们之间有什么区别一、ComparableComparable 是一个内部比较器,表示有能力比较的,其核心方法是 compareTo(T o)当一个类实现了 Comparable 接口时,除了要实现 compareTo(T o) 方法外,我们还要覆盖 equals(Object obj) 和 hashCode() 方法,这是遵守了 Object.hashCode

2020-06-21 15:55:03 79

原创 Java8 -- 07 -- IntStream类常用方法解析
原力计划

在了解完流的常用方法后,我们接着来了解下数值流的常用方法在 Java8 中,引入了三个数值流 (原始类型流特化),分别是:IntStream、LongStream、DoubleStream,它们会将流中的元素分别特化为 int、long、double,从而避免了暗含的装箱成本映射到数值流mapToInt()将对象流映射为 int 数值流mapToDouble()将对象流映射为 double 数值流mapToLong()将对象流映射为 long 数值流转换

2020-06-21 11:28:46 114

原创 Java8 -- 06 -- Stream类常用方法解析
原力计划

在了解完 Stream 的定义以及 Collectors 的常用方法之后,我们再来看看 Stream 类的常用方法Student.javapublic class Student { private String name; private int age; private double score; public Student(String name, int age, int score){ this.name = name;

2020-06-20 23:04:12 170

原创 Java8 -- 05 -- Collectors类常用方法解析
原力计划

在使用流之前,我们先来了解下 Collectors 类,因为在使用流的过程中,会经常用到该类的相关方法Collectors 工具类提供了许多静态工具方法来创建收集器,比如将元素装进一个集合中、将元素分组、根据不同标准对元素进行汇总等,现在我们就来看看它具体使用Student.javapublic class Student { private String name; private int age; private double score; public

2020-06-20 17:36:22 968 4

原创 Java8 -- 04 -- 引入Stream

在 Java8 中还引入了一个十分重要的成员,那就是流 (Stream),它允许我们使用声明性方式来处理数据集合,我们可以将它看作是一个遍历数据集的高级迭代器,流有以下特点:声明性:更简洁、更易读可复合:更灵活可并行:性能更好一、流的定义简短的定义就是:从支持数据处理操作的源中生成的元素序列元素序列跟集合一样,流提供了一个接口,用于访问特定元素类型的一组有序值与集合不同的是,流的目的在于表达计算,而集合的目的在于以特定的时间/空间复杂度存储和访问元素流

2020-06-20 13:33:23 68

原创 Java8 -- 03 -- lambda表达式
原力计划

Java8 中的一个重要特性就是支持了 lambda 表达式,所谓 lambda 表达式可以简单地理解为传递匿名函数的一种方式,它没有名称,但有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表,有以下几点特点:匿名lambda 表达式不想普通方法那样拥有一个明确的名称函数lambda 表达式不想普通方法那样属于某个特定的类,但和方法相同的是,lambda 表达式也有参数列表、函数主体、返回类型,以及可能还有一个可以抛出的异常列表传递lambda 表达式可以作为参

2020-06-19 22:02:28 191

原创 Java8 -- 02 -- 函数式接口
原力计划

函数式接口,是指只定义了一个抽象方法的接口,它可以拥有多个非抽象方法,同时可以被隐式转换为 lambda 表达式一、函数式接口在 Java8 中,接口可以拥有默认方法 (即在类没有对方法进行实现时,其主体为方法提供默认实现的方法),哪怕有很多默认方法,只要一个接口只定义了一个抽象方法,它就仍然是一个函数式接口,此外我们将函数式接口的抽象方法的签名称为函数描述符举例说明// 下面哪些接口是函数式接口public interface Adder { int add(int a, in

2020-06-19 15:24:19 89

原创 Java8 -- 01 -- 行为参数化
原力计划

Java8中出现了许多新特性,行为参数化就是其中之一,所谓行为参数化,就是可以帮助你处理频繁变更的需求的一种软件开发模式;简单来说,就是拿出一个代码块,把它准备好却不执行它,这个代码块以后可以被程序的其他部分调用,这就意味着我们可以推迟这个代码块的执行在软件开发中,一个众所周知的问题就是,不管你做什么,需求总是会在变。比如说,有个程序帮助农民了解自己的库存,第一天农民想知道库存中绿色的苹果有多少个,你写好了代码,但第二天,农民想知道自己的库存中有多少重量大于150克的,这次你又修改好了代码,之后农民又想知

2020-06-19 14:48:37 132

原创 Calculation -- 07 -- Java生成前N个斐波那契数列

常规方法private static int[] getFibonacci1(int n) { int[] fibonacci = new int[n]; if (n < 1) { return null; } if (n == 1) { fibonacci[0] = 1; return fibonacci; } if (n == 2) { fibonacci[0] = fibonac..

2020-06-19 13:46:05 57

原创 Calculation -- 06 -- Java遍历打印文件内容

常规方法private static String printFileContent1(String path) { InputStream is = null; StringBuilder builder = new StringBuilder(); try { is = new FileInputStream(path); int length; byte[] data = new byte[1<<10]; ..

2020-06-19 11:14:47 65

原创 Calculation -- 05 -- Java给定两个数字列表,返回所有的数对

常规方法private static List<int[]> getNumberPairs1(List<Integer> list1, List<Integer> list2) { List<int[]> list = new ArrayList<>(); for (Integer i : list1) { for (Integer j : list2) { list.add(new i..

2020-06-18 23:28:53 57

原创 Calculation -- 04 -- Java获取1到N之间的勾股数

常规方法private static List<double[]> getPythagoras1(int n) { List<double[]> list = new ArrayList<>(); for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { double sqrt = Math.sqrt(i * i + j * j);..

2020-06-18 11:09:09 58

原创 Calculation -- 03 -- Java分解质因数

分解质因数:把一个合数用质因数相乘的形式表示出来,分解质因数只针对合数 (如 30=2×3×5)每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数private static List<Integer> list = new ArrayList<>();private static boolean isPrime(int number) { if (number < 2) { return false; } fo

2020-06-17 22:50:38 48

原创 Calculation -- 02 -- Java筛选出1到N之间的质数

常规方法public static boolean isPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.sqrt(number); i++) { if (number % i == 0) { return false; } } return true;}publi..

2020-06-17 20:57:39 57

原创 Calculation -- 01 -- Java判断一个数是否为质数

质数 (素数):在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数合数:在大于 1 的自然数中,除了能被 1 和它本身整除外,还能被其他数 (0 除外) 整除的数public static boolean isPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.sqrt(number); i++) { if (numbe

2020-06-17 20:13:29 50

原创 Linux -- 08 -- Linux任务前后台切换

这里主要记录下 Linux 下前后任务切换的命令一、命令&将任务放入后台运行ctrl + z将正在执行的任务暂停,并放入后台jobs查看当前后台运行的所有任务jobs 命令可以查看到所有任务的编号,即为下面命令用到的 nfg %n将后台中某一任务切换到前台继续执行bg %n将后台中某一暂停的任务,变为继续执行kill %n杀死后台中某一任务二、参考资料Linux任务前后台的切换...

2020-06-17 10:35:31 62

原创 Linux -- 07 -- 编写Shell项目启动脚本

在日常开发中,我们经常会将项目打成 jar 包,部署到服务器上运行,但每次启动项目都要使用 jar -jar 命令,停止项目还需要先查找程序进程 pid,然后再进行 kill。如果只是部署一两次,手动操作没有什么多大问题,要是需要经常重新部署,每次输入命令也是挺麻烦的,因此我们可以通过编写 shell 脚本来解决这个问题一、编写 shell 脚本首先我们需要一个可运行的项目 jar 包,将其部署到服务器上 (springboot-0.0.1-SNAPSHOT.jar)然后我们再来编写 she

2020-06-16 23:12:37 71

原创 Linux -- 06 -- 查看并解决端口号占用情况

平常我们在服务器上运行项目或者是开启服务时,或多或少都会碰到过端口被占用的情况,现在让我们来看看如何解决这个问题方法一netstat -pan | grep 8080如上所示,29216 即为占用 8080 端口所在进程,因此我们将其 kill 掉就可以了kill -9 29216方法二lsof -i :8080kill -9 29216不过为了安全起见,我们可以通过 ps -ef | grep 29216 来查看该进程所在的程序,判断该程序是否有用

2020-06-16 23:07:07 49

原创 SpringBoot -- 06 -- ApplicationRunner和CommandLineRunner的区别

ApplicationRunner 接口用于在项目启动后做一些初始化的工作,与之相类似的还有一个接口 CommandLineRunner,两者作用相同,那他们之前又有什么区别呢?让我们来一起看看一、执行顺序不同MyApplicationRunner.java@Componentpublic class MyApplicationRunner implements ApplicationRunner { @Override public void run(Application

2020-06-16 10:46:49 142

原创 Zookeeper -- 01 -- Linux上源码包安装Zookeeper

一、下载 Nginx首先我们上官网,下载最新稳定的版本,这里我下载的是 zookeeper-3.4.14.tar.gz二、上传至 Linux 并解压第一种方式mkdir /usr/local/zookeepercd /usr/local/zookeeperrztar -zxvf zookeeper-3.4.14.tar.gzrm -rf zookeeper-3.4.14.tar.gz第二种方式mkdir /usr/local/zookeeper

2020-06-15 15:32:11 59

原创 Nginx -- 03 -- 正向代理、反向代理

Nginx 是时下最流行的 HTTP 服务器之一,同时也是一个反向代理服务器,提到反向代理,就不得不提到正向代理了,现在我们就来深入了解下这两个概念

2020-06-14 16:13:30 123

原创 Nginx -- 10 -- Nginx之ngx_http_stub_status_module模块

ngx_http_stub_status_module,该模块提供对基本状态信息的访问官方文档:Module ngx_http_stub_status_module默认情况下,该模块未被构建,可以使用 –with-http_stub_status_module 配置参数来启用该模块./configure --prefix=/usr/local/nginx/ --with-http_stub_status_modulemakemake install通过 nginx -V 命令,我们可以查看

2020-06-14 13:17:26 68

原创 Nginx -- 01 -- 网络代理

一、代理(Proxy)代理,也称为网络代理,是一种特殊的网络服务,允许一个网络终端通过这个服务与另一个网络终端进行非直接的链接二、代理服务器(Proxy Server)提供代理服务的计算机系统或其他类型的网络终端称为代理服务器三、代理流程客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或者获得目标服务器的指定资源在获取目标服务器的...

2020-06-14 11:31:59 121

原创 Tomcat -- 09 -- Tomcat远程Debug

在日常的开发过程中,不管是在开发环境还是生产环境,Tomcat 应该是我们经常能用到的 Web 服务器,这里主要介绍下如何进行 Tomcat 远程 Debug在这之前,我们先来了解下一个概念:JDWP (Java Debug Wire Protocol),其定义了调式器 (debugger) 和被调试的 Java 虚拟机 (target vm) 之间的通信协议一、下载 Tomcat首先我们上官网下载最新的 Tomcat,这里我下载的是 apache-tomcat-9.0.36.tar.gz,将其

2020-06-13 14:19:48 47

转载 Tomcat -- 08 -- Tomcat启动时卡住 (Deploying web application directory) 解决方法

本文转载自:(亲测解决)Tomcat启动时卡在“ Deploying web application directory ”很久的解决方法在 Linux 上运行 Tomcat 时,有时候会碰到 Tomcat 启动卡住的问题 (卡在 “INFO: Deploying web application directory …” 这一步),需要等待好长时间才能启动完成在上网查找了相关资料后,解决方法如下cd /usr/local/java/jdk1.8/jre/lib/security (需要替换为自.

2020-06-13 13:41:08 109

原创 Tomcat -- 07 -- Linux上部署war包

这里主要介绍下如何将项目打包成 war 包,并将其部署到服务器上进行访问用到的工具如下IntelliJ IDEA 2018.3.1 x64apache-tomcat-9.0.36apache-maven-3.5.2一、编写项目首先我们先创建一个 SpringBoot 项目,该项目里只有一个类,如下所示@RestControllerpublic class HelloController { @GetMapping(value = "/hello")

2020-06-13 13:03:14 37

提示
确定要删除当前文章?
取消 删除