动态线程池
参考文章:
https://juejin.cn/post/7240065163486216253?searchId=20231203165817CBC489F5600224B8EE47
Nacos实现动态线程池:
https://juejin.cn/post/7263840667826503717?searchId=20231203171916C0A9AB29FEE1E9B719EB#heading-3
美团技术:
Java线程池实现原理及其在美团业务中的实践 - 美团技术团队 (meituan.com) (opens new window)
# Worker线程
线程池为了掌握线程的状态并维护线程的生命周期,设计了线程池内的工作线程Worker:
private final class Worker extends AbstractQueuedSynchronizer implements Runnable{
final Thread thread;//Worker持有的线程
Runnable firstTask;//初始化的任务,可以为null
}
2
3
4
如果firstTask非空,那么线程在启动初期立即执行这个任务,对应核心线程创建时情况;
如果firstTask为空,需要创建一个线程去执行任务队列种的任务,对应非核心线程的创建;
线程池用一张哈希表去持有线程的引用,管理线程的生命周期,线程不运行就要销毁线程,就是断开该引用,由JVM垃圾回收;
如何判断线程是否运行?
Worker继承自AQS,如果获取到独占锁,表示该线程在执行任务,不是独占锁状态,就是空闲线程,可以对该线程中断;
# Worker线程增加
addWorker两个参数(firstTask,core);
firstTask指定新增的线程执行的第一个任务,该参数可以为空;
core参数为true表示在新增线程时会判断当前活动线程数是否少于corePoolSize,false表示新增线程前需要判断当前活动线程数是否少于maximumPoolSize;
# 动态线程池参数动态化
JDK允许通过ThreadPoolExecutor的实例来动态设置线程池,
以setCorePoolSize为方法例,在运行期线程池使用方调用此方法设置corePoolSize之后,线程池会直接覆盖原来的corePoolSize值,并且基于当前值和原始值的比较结果采取不同的处理策略;
- 对于当前值小于当前工作线程数的情况,说明有多余的worker线程,此时会向当前空闲的worker线程发起中断请求以实现回收,多余的worker在下次空闲的时候也会被回收;
- 对于当前值大于原始值且当前队列中有待执行任务,则线程池会创建新的worker线程来执行队列任务;