
ThreadPoolExecutor线程池任务执行失败的时候会怎样
发布日期:2021-05-09 01:27:29
浏览次数:12
分类:博客文章
本文共 919 字,大约阅读时间需要 3 分钟。
接上一篇 《》
1. 任务执行失败时的处理逻辑
1.1. Worker
Worker相当于线程池中的线程
可以看到,Worker有几个重要的属性:
- thread : 这是Worker运行的线程,可以理解为一个Worker就是一个线程
- firstTask : 初始任务,可能为为null
- completedTasks : Worker完成的任务数
同时,还应该注意到,在构造方法中给thread赋值为一个新线程。由于Worker实现了Runnable接口,也就是说它本身就是可执行的任务,当它启动的时候理所当然应该运行run()方法,而它的run()方法中调用了runWorker(this)方法
1.2. Worker是如何创建的
主要是:创建Workder对象,并将该对象加入到Worker集合中,最后启动Worker(PS:启动Worker中的线程是启动Worker)
1.3. runWorker(this)
可以看到,创建线程的时候传的是this,this代表的是Worker对象,而Worker是一个Runnable,因此当调用线程的start()方法后执行的是Worker的run()方法,而Worker的run()方法里面调用的时候runWorker(this),因此,接下来重点看一下runWorker(this)
如果task.run()方法抛异常,则会被catch捕捉到,但是catch又将异常抛出去了,外层的两个try没有捕获,跳出循环,执行3个finally
我们只看最后一个finally
看到这里,一切真相大白
当任务执行失败后,该Workder会被从Worker集合中删除,然后,只要线程池当前还在继续处理任务,则重新创建一个新的Worker
也就是说,任务执行失败后,原来的Worker就死了,如果线程池还在继续处理任务,则再创建一个新的Worker
2. 拒绝策略
四种策略:
- 直接抛异常(默认)
- 什么也不做,也不抛异常
- 如果线程池当期处于RUNNING状态,则执行这个任务,否则什么也不做
- 如果线程池当前处于RUNNING状态,则删除队列头部的任务,然后将该任务加到工作任务队列中
3. 其它相关
《》
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月31日 18时30分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
软中断和实时性
2021-05-09
Linux探测工具BCC(可观测性)
2021-05-09
SNMP介绍及使用,超有用,建议收藏!
2021-05-09
HDU5589:Tree(莫队+01字典树)
2021-05-09
不停机替换线上代码? 你没听错,Arthas它能做到
2021-05-09
Python开发之序列化与反序列化:pickle、json模块使用详解
2021-05-09
回顾-生成 vs 判别模型-和图
2021-05-09
采坑 - 字符串的 "" 与 pd.isnull()
2021-05-09
无序列表 - 链表
2021-05-09
Matplotlib绘制漫威英雄战力图,带你飞起来!
2021-05-09
机器学习是什么
2021-05-09
《小王子》里一些后知后觉的道理
2021-05-09
《你当像鸟飞往你的山》总结
2021-05-09
《我是猫》总结
2021-05-09
《抗糖化书》总结
2021-05-09
apache虚拟主机配置
2021-05-09
光盘作为yum源
2021-05-09
PHP 正则表达式资料
2021-05-09
PHP官方网站及PHP手册
2021-05-09
mcrypt加密以及解密过程
2021-05-09