美团的技术公众号,推送了Java线程池原理,梳理和学习笔记
线程池是什么
池化的线程管理工具
线程池解决了什么问题
1、减少频繁的申请和销毁的开销 2、对资源无线申请缺少限制资源,容易引发资源耗尽 3、系统无法合理统一的管理资源
线程池的实现
生命周期的管理
在线程池中最重要的两个内部数据,一是状态,二是线程池的链接数。在判断线程池是否可用的时候,经常需要把两个数据放在一起去比较。所有这里用了高位3位保存state,低29位保存链接数
任务管理
excute() ---> addWorker() ----> runWork()'getTask()'
线程管理
- addWorker()
<核心线程 新建worker =核心线程,bolckingQueue 未满 添加队列 bolckingQueue 已满 <max线程数 新建worker else 执行rejectTask策略 default 抛出异常
- runWork()'getTask()'
getFirstTask !=null excute
从队列中获取任务,getTask(),如果从队列中获取的任务为空话,当前的线程数小于或等于核心信息,就需要让获取线程的worker阻塞 pull(time,unit),runWorker的task为空就会将worker一处workerSet同时销毁线程
线程池的核心参数
核心线程数 最大线程数 阻塞队列类型
线程池的性能和上面的参数有很大关系,为什么不用ThreadExcutors来创建线程,就是要定制化线程池创建参数
美团对线程池的改进
动态配只线程池的核心参数,修改执行