本文摘自:


本质

生产者-消费者模式

线程池的使用方式消费者,线程池本身是生产者

主要模型

线程池是一套围绕着核心线程、非核心线程、等待队列的任务调度框架。默认情况,线程池主要结构如下:

640.png

corePoolSize 核心线程数

当前线程池中运行的线程数量还没有达到 corePoolSize 大小时,线程池会将任务直接提交给核心线程执行
640.gif

BlockingQueue 等待队列

如果当前线程池中运行的线程数量已经达到 corePoolSize ,新提交的任务会被加入到 等待队列
640 (1).gif

直到某一个「核心线程」执行任务完毕,处于空闲状态,线程池会 等待队列 中取出一个新的任务执行
640.gif

maximumPoolSize 最大线程数

当线程数大于corePoolSize 数量,并且等待队列已满,但是还没有达到最大线程数maximumPoolSize,则线程池会创建新的「非核心线程」来执行任务
640.gif

RejectedExecutionException 任务拒绝策略

如果提交的任务,无法被核心线程直接执行,又无法加入等待队列,又无法创建“非核心线程”直接执行,线程池将根据拒绝处理器定义的策略处理这个任务
640.gif

总结

把线程池类比为一个项目组,则线程就是项目组的成员。

  • corPoolSize 表示线程池保有的最小线程数。有些项目很闲,但是也不能把人都撤了,至少要留 corePoolSize 个人坚守阵地

  • maximumPoolSize 表示线程池创建的最大线程数。当项目很忙时,就需要加人,但是也不能无限制地加,最多就加到 maximumPoolSize 个人。当项目闲下来时,就要撤人了,最多能撤到 corePoolSize 个人

  • keepAliveTime & unit 一个线程如果在一段时间内,都没有执行任务,说明很闲,keepAliveTime 和 unit 就是用来定义这个「一段时间」的参数。也就是说,如果一个线程空闲了keepAliveTime & unit 这么久,而且线程池的线程数大于 corePoolSize ,那么这个空闲的线程就要被回收了

  • workQueue 工作队列

  • threadFactory 自定义如何创建线程,例如可以给线程指定一个有意义的名字

  • handler 自定义任务的拒绝策略