java 并发编程 - 线程池

145 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

线程池

好处

1.减少创建和销毁线程的资源损耗:重复利用已创建的线程

2.更快的响应:当执行任务时,跳过创建线程这部操作来节省时间

3.提高线程的可管理性:无限制创建线程会降低系统稳定性,使用线程池进行统一的创建,调度监控

七大参数

image-20220310205740937

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上处理其他事务

建议使用有界队列,能够增强系统的稳定性,可以及时发现挤压过多任务的预警


\