一个线程罢工的诡异事件
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状态.