100_线程池
池化技术
线程池的好处
三大方法
单个数量 Executors.newSingleThreadExecutor()
固定数量 Executors.newFixedThreadPool()
可变数量 Executors.newCachedThreadPool()
七大参数
源码分析
七大参数定义

:::info
最大承载线程数=最大线程池大小+阻塞队列大小
超出最大承载线程数,就会触发拒绝策略
:::
自定义线程池


:::info
1个线程,只使用核心线程池中的1个线程
:::

:::info
5个线程,核心线程池大小为2,阻塞队列大小为3,没有超过两者之和(核心+阻塞队列),使用核心线程池的2个线程
:::


:::info
6个线程,核心线程池大小为2,阻塞队列大小为3,超过两者之和(核心+阻塞队列),使用核心线程池的2个线程和扩展的1个线程
:::

:::info
7个线程,核心线程池大小为2,阻塞队列大小为3,超过两者之和(核心+阻塞队列),使用核心线程池的2个线程和扩展的2个线程
:::

:::info
8个线程,核心线程池大小为2,阻塞队列大小为3,超过两者之和(核心+阻塞队列),使用核心线程池的2个线程和扩展的3个线程
:::

:::success
最大承载线程数=最大线程池大小+阻塞队列大小
超出最大承载线程数,就会触发拒绝策略
:::
:::info
9个线程,核心线程池大小为2,阻塞队列大小为3,超过两者之和(核心+阻塞队列),使用核心线程池的2个线程和扩展的3个线程,线程数量9超过最大承载线程数8(5+3),触发拒绝策略,抛出异常 java.util.concurrent.RejectedExecutionException
:::


四种拒绝策略


:::success
最大承载线程数=最大线程池大小+阻塞队列大小
超出最大承载线程数,就会触发拒绝策略
:::
AbortPolicy 抛出异常
:::info
9个线程,核心线程池大小为2,阻塞队列大小为3,超过两者之和(核心+阻塞队列),使用核心线程池的2个线程和扩展的3个线程,线程数量9超过最大承载线程数8(5+3),触发拒绝策略,抛出异常 java.util.concurrent.RejectedExecutionException
:::


CallerRunsPolicy 哪来的去哪里,调用方来执行
:::info
9个线程,核心线程池大小为2,阻塞队列大小为3,超过两者之和(核心+阻塞队列),使用核心线程池的2个线程和扩展的3个线程,线程数量9超过最大承载线程数8(5+3),触发拒绝策略,哪来的去哪里,调用方主线程来执行
:::


DiscardPolicy 不抛出异常,丢掉任务
:::info
9个线程,核心线程池大小为2,阻塞队列大小为3,超过两者之和(核心+阻塞队列),使用核心线程池的2个线程和扩展的3个线程,线程数量9超过最大承载线程数8(5+3),触发拒绝策略,不抛出异常,丢掉任务,不去执行
:::


DiscardOldestPolicy 不抛出异常,尝试去和最早的线程竞争,成功,执行任务,失败,丢掉任务,不去执行
:::info
9个线程,核心线程池大小为2,阻塞队列大小为3,超过两者之和(核心+阻塞队列),使用核心线程池的2个线程和扩展的3个线程,线程数量9超过最大承载线程数8(5+3),触发拒绝策略,不抛出异常,尝试去和最早的线程竞争,成功,执行任务,失败,丢掉任务,不去执行
:::


最大线程池大小如何定义
CPU 密集型
:::info
CPU 密集型,CPU逻辑处理器数量,可以保持CPU的效率最高
一般设置:
核心线程池大小=CPU逻辑处理器数量
最大线程池大小=核心线程池大小 * 2
:::
Runtime.getRuntime().availableProcessors();
IO 密集型
:::info
IO 密集型,判断程序中十分耗IO的线程数量
一般设置:
核心线程池大小=十分耗IO的线程数量 * 2
最大线程池大小=核心线程池大小 * 2
:::















浙公网安备 33010602011771号