ThreadPoolExecutor源码
2021-08-18 10:01:28 4 举报
ThreadPoolExecutor源码
作者其他创作
大纲/内容
循环从从阻塞队列中取任务
释放锁
判断线程是否执行出现异常
线程池线程复用的逻辑,通过把任务和线程封成worker一个对象通过启动每个woeker对象,内部一个while循环获取任务,执行任务的run方法达到线程复用
Runnable task = w.firstTask
workers.remove(w);非核心线程数回收完成
根据线程池状态进行判断是否结束线程池
如果出现异常 workerCount减1没出现异常就不用操作 getTask已减1
task.run()执行提交任务的run方法
成功
workQueue.poll(keepAliveTime
创建线程池
workQueue.offer(command)
执行woker对象的 t.start()调用run方法
if (workerCountOf(c) < corePoolSize)
while (task != null || (task = getTask()) != null)
Worker.run添加完后,启动任务
new Worker(firstTask)创建对象
worker对象
reject(command)执行拒绝策略
tryTerminate
提交任务
创建非核心线程
小于核心线程数
firstTask新增线程的第一个任务
获取独占锁 ReentrantLock把worker放入集合中
如果task为null则跳出循环执行非核心线程回收工作默认核心线程不允许回收
getTask()
threadFactory线程池工厂创建线线程
队列未满放入成功
从线程池中移除了一个工作线程
先workerCount数减1(CAS)在指定等待时间没有从队列中获取到任务task就返回null
thread线程
队列已满,放入失败
核心线程数已满放入阻塞队列
completedAbruptly=true
查询线程池数量
runWorker(this)
当线程池是RUNNING或SHUTDOWN状态时,如果worker是异常结束,那么会直接addWorker
HashSet<Worker>workers.add(w)
线程池中的每一个线程被封装成一个Worker对象
判断核心线程数是否已满
获取firstTask新创建线程的第一个任务
decrementWorkerCount()
execute(Runnable command)
cas+1更新线程池数量失败则重试
workerCountOf(recheck) == 0
0 条评论
回复 删除
下一页