本文共 502 字,大约阅读时间需要 1 分钟。
这2篇文章讲到一个线程池使用抛异常相关的问题处理.第一篇是原著,第二篇是引用与讲解.通读之后,发现第一篇文章只读一遍并不能完全理解意思,而第二篇文章则是没有搞懂第一篇作者的意思,对线程池任务的理解也不对.
说说我对第一篇文章的理解:
业务中线程池里的任务应该是在不断循环消费数据,且线程池是单线程的.该线程池的任务对数据做简单处理就交给另一个线程池做处理.
任务的代码不能报错,否则会中断并结束任务.任务一直在,线程池就不会走到WAITING,而是RUNNABLE状态.
若代码报错,线程池的processWorkExit方法会删除该任务,并加入新的任务,而新的任务是null.不会执行任何业务逻辑.所以线程池一直处于WAITING状态.
任务被删除后,就没有再消费数据,因此数据库中的数据一直没有更新,而生产者的数据队列一直积累到满为止.
解决办法就是使Runnable任务不报错,从而能一直不断地处理消息.
对于第二篇文章,我想说的是,重点在于任务报错后,就没有任务去处理数据了,而不在于WAITING状态.不论是否报错,任务队列没有任务了,线程池都会走到WAITING状态.
转载地址:http://ehbws.baihongyu.com/