在阅读vitamin的heartbeat功能时,内部实现使用到了Java中的threadpoolExecutor ,这里对自己学习到的一些知识做一些总结
线程池的目的与使用的背景:在并发请求数量非常多,但是处理的时间又比较短,开销主要在线程的生成和销毁上时,线程池就能很好的派上用场
Java中的线程池是用ThreadPoolExecutor类来实现的,以下是主要的类图
主要了解线程的创建、管理以及后台任务的调度等方面的执行原理。结合这些 去理解heartbeat中的代码
首先heatbeat中的成员变量:
存在于executor相关的两个接口,首先解释这两个接口的含义:
初始化代码中 sendHeartbeatService 和 processHeartbeatService 都用了ThreadPoolExecutor构造方法初始化
这里需要理解这个ThreadPoolExecutor构造方法才能理解各个参数的含义:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize:核心线程数量,当有新任务在execute()方法提交时,会执行以下判断:
所以,任务提交时,判断的顺序为 corePoolSize --> workQueue --> maximumPoolSize。
这里面有一个重要的逻辑需要了解:execute 方法执行一个线程时,是有一个调度过程的,会根据corePoolSize 、队列是否阻塞和maximumPoolSize这些参数进行判断,是否创建新线程执行还是到队列里等待
等,下面是流程图
原文:https://www.cnblogs.com/xierunfang/p/11973212.html