Java线程池学习笔记

145 阅读1分钟

美团的技术公众号,推送了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来创建线程,就是要定制化线程池创建参数

美团对线程池的改进

动态配只线程池的核心参数,修改执行