Java 中的线程池

JDK 的 JUC 包中提供了很多与并发相关的类,其中线程池这个类尤为关键。

线程池可以通过重用线程,降低线程创建和销毁造成的资源消耗。

线程池核心参数

线程池类 ThreadPoolExecutor 有 7 个参数:

参数 含义 解释
corePoolSize 核心线程数目 正常保留的线程数,即使没有任务执行
maximunPoolSize 最大线程数目 核心线程数 + 救急线程数
keepAliveTime 生存时间 救急线程空闲的存在时间
unit 时间单位 生存时间的单位
workQueue 阻塞队列 存储等待执行的任务
threadFactory 线程工厂 创建线程
handler 拒绝策略 提供了 4 种

线程池执行流程

当线程池接收到任务后:

  • 创建核心线程
  • 如果核心线程数满了
  • 将任务放入队列
  • 如果队列满了
  • 创建救急线程
  • 如果救急线程满了
  • 执行拒绝策略
  • 此时任务一定被上述某一环节处理
  • 当救急线程等待到最大生存时间自行销毁

4 种拒绝策略

除了核心线程和救急线程可以处理任务,拒绝策略也可以处理任务:

ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常;

ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常;

ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程);

ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。

转载请注明出处:码谱记录 » Java 中的线程池
标签: