JDK 的 JUC 包中提供了很多与并发相关的类,其中线程池这个类尤为关键。
线程池可以通过重用线程,降低线程创建和销毁造成的资源消耗。
线程池核心参数
线程池类 ThreadPoolExecutor 有 7 个参数:
参数 | 含义 | 解释 |
---|---|---|
corePoolSize | 核心线程数目 | 正常保留的线程数,即使没有任务执行 |
maximunPoolSize | 最大线程数目 | 核心线程数 + 救急线程数 |
keepAliveTime | 生存时间 | 救急线程空闲的存在时间 |
unit | 时间单位 | 生存时间的单位 |
workQueue | 阻塞队列 | 存储等待执行的任务 |
threadFactory | 线程工厂 | 创建线程 |
handler | 拒绝策略 | 提供了 4 种 |
线程池执行流程
当线程池接收到任务后:
- 创建核心线程
- 如果核心线程数满了
- 将任务放入队列
- 如果队列满了
- 创建救急线程
- 如果救急线程满了
- 执行拒绝策略
- 此时任务一定被上述某一环节处理
- 当救急线程等待到最大生存时间自行销毁
4 种拒绝策略
除了核心线程和救急线程可以处理任务,拒绝策略也可以处理任务:
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常;
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常;
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程);
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。