(四)JDK线程池源码分析3之常见问题解答
-
概述
在线程池使用过程中难免会有一些疑问,比如一些参数怎么设置,线程池中线程怎么回收,核心线程和非核心线程的区别,线程在执行任务发生异常,执行任务发生异常任务会不会丢失,线程池任务队列满了怎么办等… 这篇文章将会从源码的角度给出答案 -
线程执行任务发生异常,线程会回收吗? 执行的任务会丢失吗?
1-我们看到在执行一个任务,不管是完成还是抛异常,都会执行afterExecute方法,而这个实现是null,也就是默认情况下,任务会丢失的,要继承ThreadPoolExecutor实现这个方法,这样就可以获得抛出异常的任务了.
2-在processWorkerExit中,只要进入这个方法,都是直接移除这个线程的,然后因为是异常终止,根据getTask方法的策略这个队列是需要的,那么直接添加一个新的线程(注意:这里每个线程是没有状态管理的,这个可能和我们想象中的不一样)