(四)JDK线程池源码分析3之常见问题解答

  • 概述
    在线程池使用过程中难免会有一些疑问,比如一些参数怎么设置,线程池中线程怎么回收,核心线程和非核心线程的区别,线程在执行任务发生异常,执行任务发生异常任务会不会丢失,线程池任务队列满了怎么办等… 这篇文章将会从源码的角度给出答案

    JDK线程池源码分析1-线程池执行启动流程
    JDK线程池源码分析2-线程池中线程生命周期

  • 线程执行任务发生异常,线程会回收吗? 执行的任务会丢失吗?
    (四)JDK线程池源码分析3之常见问题解答
    (四)JDK线程池源码分析3之常见问题解答
    (四)JDK线程池源码分析3之常见问题解答
    1-我们看到在执行一个任务,不管是完成还是抛异常,都会执行afterExecute方法,而这个实现是null,也就是默认情况下,任务会丢失的,要继承ThreadPoolExecutor实现这个方法,这样就可以获得抛出异常的任务了.
    2-在processWorkerExit中,只要进入这个方法,都是直接移除这个线程的,然后因为是异常终止,根据getTask方法的策略这个队列是需要的,那么直接添加一个新的线程(注意:这里每个线程是没有状态管理的,这个可能和我们想象中的不一样)