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

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

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

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

  • 线程池中,至少是coreSize个线程吗?
    答案:不是,这个取决于allowCoreThreadTimeOut这个参数的设置
    1.当allowCoreThreadTimeOut=false的时候,这个是默认值,我们平常使用的就是false.
    当这个值是false时,表示不对核心线程做超时处理,那么核心线程只要不出意外中断,会一直阻塞获取任务。
    在这里插入图片描述
    2.当allowCoreThreadTimeOut=true的时候,那么在任务池没任务的时候,就会处理等待超时,如果在规定时间内还没获取到任务,即使是核心线程,也会退出。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    答案:当allowCoreThreadTimeOut=true时候,最少线程数为0,当allowCoreThreadTimeOut=false时候,最少线程数为coreSize

发布了65 篇原创文章 · 获赞 11 · 访问量 7141

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/102656889