100_线程池


池化技术

image.png

线程池的好处

image.png

三大方法

image.png
image.png

单个数量 Executors.newSingleThreadExecutor()

image.png
image.png

固定数量 Executors.newFixedThreadPool()

image.png
image.png

可变数量 Executors.newCachedThreadPool()

image.png
image.png
image.png
image.png

七大参数

源码分析

image.png
image.png

七大参数定义

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

自定义线程池

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

四种拒绝策略

image.png
image.png
:::success
最大承载线程数=最大线程池大小+阻塞队列大小
超出最大承载线程数,就会触发拒绝策略
:::

AbortPolicy 抛出异常

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

CallerRunsPolicy 哪来的去哪里,调用方来执行

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

DiscardPolicy 不抛出异常,丢掉任务

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

DiscardOldestPolicy 不抛出异常,尝试去和最早的线程竞争,成功,执行任务,失败,丢掉任务,不去执行

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

最大线程池大小如何定义

CPU 密集型

:::info
CPU 密集型,CPU逻辑处理器数量,可以保持CPU的效率最高
一般设置:
核心线程池大小=CPU逻辑处理器数量
最大线程池大小=核心线程池大小 * 2
:::

Runtime.getRuntime().availableProcessors();

IO 密集型

:::info
IO 密集型,判断程序中十分耗IO的线程数量
一般设置:
核心线程池大小=十分耗IO的线程数量 * 2
最大线程池大小=核心线程池大小 * 2
:::

posted @ 2022-11-15 21:06  清风(学习-踏实)  阅读(46)  评论(0)    收藏  举报