ThreadPool
2021-04-11 10:58:47 9 举报
线程池笔记
作者其他创作
大纲/内容
RejectExecutionHandle
给正在执行的任务加锁w.lock()(表示正在执行任务,不应该被打断),shutdown时w.tryLock()
take
任务提交
返回一个future类型的对象
WorkThread
无界队列→OOM
1️⃣ CPU密集型
Y
2️⃣ I/O密集型
KeepAliveTime临时线程存活时间
拒绝策略
关闭线程池
1、queue满了,添加临时线程2、queue空了,删除临时线程
无返回参数
线程池收缩
→Eager(预热→抢购)
BlockQueue是否满?
3️⃣抛弃最旧的DiscardOldestPolicy
RejectExecutionHandle拒绝|饱和策略
CorePoolSize核心线程数
execute
1️⃣终止(抛异常)AbortPolicy(默认)
实现RejectedExecutionHandler接口
大部分时间在等待I/O输入输出
TimeUnit存活单位
可收缩
压测
CorePoolSize是否满?
MaximumPoolSize最大线程数
控制:临时线程空闲多久会被回收
WorkQueue
SynchronousQueue
适用于非常大的,或者无界的线程池,可以避免任务排队。
2️⃣调用者运行(同步)CallerRunsPolicy
提交任务
result
ThreadFactory线程工厂
❌如果一直有优先级高的任务提交到队列,优先级低的可能永远无法执行。
生产者
BlockQueue
消费者
临时线程和核心线程没有本质的区别
N放入阻塞队列
Thread Pool
submit/execute
lazy load
线程池大小选择
N创建核心线程
BlockQueue任务队列
吞吐量:SynchronousQueue > LinkedBlockingQueue > ArrayBlockingQueue;
临时线程数=MaximumPoolSize-CorePoolSize
2N
大部分时间在计算
基于数组结构的有界阻塞队列
任务
2️⃣ WorkQueue==null
不推荐使用juc默认提供的
如果任务不一定要执行完,可以选择调用这个方法
N创建临时线程
ArrayBlockingQueue
Shutdown
将线程池的状态设置为SHUTDOWN状态,然后中断所有没有正在执行的任务。
submit
ShutdownNow
逻辑流程图
生产者/消费者模型
5️⃣自定义
7大入参
1️⃣ 大于CorePoolSize&&线程空闲
cpu核数*目标利用率*(1+平均等待时间/平均工作时间)
EexcutorService
推荐:有界队列
MaximumPoolSize是否满?
N+1
PriorityBlockingQueue
具有优先级的无线阻塞队列
4️⃣抛弃DiscardPolicy
LinkedBlockingQueue
0 条评论
下一页