关于线程池任务报错的处理与理解

 

一个线程罢工的诡异事件

https://mp.weixin.qq.com/s/dqOy2eeeOsDa1AN3nNUftg

ThreadPoolExcutor 线程池 异常处理 (上篇)

https://www.cnblogs.com/wang-meng/p/10588637.html

 这2篇文章讲到一个线程池使用抛异常相关的问题处理.第一篇是原著,第二篇是引用与讲解.通读之后,发现第一篇文章只读一遍并不能完全理解意思,而第二篇文章则是没有搞懂第一篇作者的意思,对线程池任务的理解也不对.

说说我对第一篇文章的理解:

业务中线程池里的任务应该是在不断循环消费数据,且线程池是单线程的.该线程池的任务对数据做简单处理就交给另一个线程池做处理.

任务的代码不能报错,否则会中断并结束任务.任务一直在,线程池就不会走到WAITING,而是RUNNABLE状态.

若代码报错,线程池的processWorkExit方法会删除该任务,并加入新的任务,而新的任务是null.不会执行任何业务逻辑.所以线程池一直处于WAITING状态.

任务被删除后,就没有再消费数据,因此数据库中的数据一直没有更新,而生产者的数据队列一直积累到满为止.

解决办法就是使Runnable任务不报错,从而能一直不断地处理消息.

对于第二篇文章,我想说的是,重点在于任务报错后,就没有任务去处理数据了,而不在于WAITING状态.不论是否报错,任务队列没有任务了,线程池都会走到WAITING状态.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值