ThreadPoolExecutor原理、使用分析
2020-09-29 15:35:00 1 举报
ThreadPoolExecutor执行过程分析,封装思想整理
作者其他创作
大纲/内容
task
1. 当线程池中的线程小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程
销毁
任务执行
maximumPoolSize
DiscardPolicy:直接丢弃任务
threadPool
keepAliveTime到了
workqueue
corePoolSize
ThreadPoolExecutor包装模式(Executors)
DiscardOldestPolicy:抛弃队列中等待最久的任务,加入当前任务
执行
RejectedExecutionHandler handler
AbortPolicy:直接抛出RejectedExecutionException给提交任务方法
空闲时间keepAliveTimeunit
CallerRunsPolicy:退回给调用者,减小流量
3. 当workQueue已满,且maximumPoolSize大于corePoolSize时,新提交任务会创建新线程执行任务
ThreadPoolExecutor
workers(threadPool)
4. 当提交任务数超过马项目吗PoolSize+workQueue时,新提交任务由RejectedExecutionHandle处理
ThreadPoolExecutor执行过程分解
6. 当有空闲线程时,workQueue中的任务会被调用执行
需判断allowCoreThreadTimeOut == true
Executors的静态创建方法
keepAliveTime
unit
workQueue
问题
newFixedThreadPool
nThreads(参数)
0L
TimeUnit.MILLISECONDS
LinkedBlockingQueue
workQueue无界
newCachedThreadPool
0
Integer.MAX_VALUE
60L
TimeUnit.SECONDS
SynchronousQueue(只能有一个元素的阻塞队列)
线程数约等于无界
newScheduledThreadPool:ScheduledThreadPoolExecutor
corePoolSize(参数)
NANOSECONDS
DelayedWorkQueue(定制的优先级队列)
newSingleThreadExecutor
1
ThreadPoolExecutor依赖处理
2. 当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行。
拒绝策略
5. 当线程池中线程数超过corePoolSize,空闲时间超过keepAliveTime的线程会被销毁
完成上一节的任务,ThreadPoolExecutor需要:1. 等待队列,当核心线程满的时候,暂存任务。通过workqueue注入。2. 需要线程执行任务,创建线程太麻烦,注入threadFactory来创建线程。3. 线程放到workers中记录执行4. 线程池需要一个空闲清除时间,注入。5. 当装满了,装不下了。需要拒绝新来任务。怎么拒绝?注入把。学习这种依赖管理办法,通过接口隔离,注入来完成功能扩展。
RejectedExecutionHandle
线程
疑问:taskQueue中有数据时,corePoolSize会空闲过期吗?疑问:非核心线程会去执行taskQueue中的任务吗?
线程创建threadFactory
0 条评论
下一页