一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
线程池
好处
1.减少创建和销毁线程的资源损耗:重复利用已创建的线程
2.更快的响应:当执行任务时,跳过创建线程这部操作来节省时间
3.提高线程的可管理性:无限制创建线程会降低系统稳定性,使用线程池进行统一的创建,调度监控
七大参数
1.coolPoolSize: 核心线程数:来一个任务就创建一个线程直到上限。prestartAllCoreThreads可提前开启该数量的线程
2.maxinumPoolSize:总线程数大小:当任务队列塞满,还有任务进来,就开启临时的线程用来缓解压力,线程池中线程数的总上限即该值。如果使用了无界的任务队列,那么这个参数就没用了
3.keepAliveTime:线程活动保持时间* :临时线程的空闲后的存活时间
4.unit:时间的单位 : DAY,HOURS,MINUTES,SECONDES,MILLISECONDES
5.workQueue:任务队列:用于保存等待执行任务的队列,当核心线程任务已满,多余的线程就会存放在任务队列中。
6.threadFactory:创建线程的工厂:可以通过线程工厂给线程取名
7.handler:饱和策略:当线程和队列都满,线程池处于饱和状态,必须采取一种策略来应对多余的任务
- AbortPolicy:直接抛出异常
- CallerRunsPolicy: 只用调用者所在线程来运行任务
- DiscardOldestPolicy:丢弃队列里最老的一个任务,并执行这个(相当于替代最老任务执行)
- DiscardPolicy:直接丢弃
API
execute 和submit
execute用于执行没有返回值的任务,因此无法判断任务是否被执行成功
submit用于执行有返回值 的任务.会返回一个future类型的对象,通过这个对象可以判断任务是否成功.通过future.get() 获取返回值
线程池优化思路
-
CPU密集型的话减少线程池的线程,使CPU多执行,少上下文切换.
- 可以设置线程数为N(CPU核心数) + 1.多出来的一个线程为了防止线程睡眠等导致的某个CPU暂时不可用
-
IO密集型的话增加线程池的线程,是CPU再等待IO期间能够执行其他任务,充分利用CPU性能
- 可以设置成线程数为2N.相当于每个CPU有一个备用CPU,当出现IO操作时,可以在备用CPU上处理其他事务
建议使用有界队列,能够增强系统的稳定性,可以及时发现挤压过多任务的预警
\