• 10.线程池状态和线程周期


    线程池状态及生命周期

    线程池在其生命周期中会经历多种状态,这些状态被定义在threadPoolExecutor中,一共有5种。

    这些状态所对应的描述如图所示,

    下面几小节将介绍这些状态。

    首先来看第一个状态,running,他表示线程池正在运行,

    可以接受新任务,并且也能处理任务队列中的任务,下面动画演示running状态。

    这是一个正在运行的线程池。

    其中有4个正在执行任务的线程,任务队列中还有2个未执行的任务,队列还有空位,

    我们可以继续向线程池中提交新任务,如果池中没有空闲的线程,那么新任务将会被放入任务队列中,

    当线程执行完任务时,

    他们会从任务对应中获取任务,继续执行,

    直到所有任务全部执行完毕,看完running状态,再来看下一个状态。

    shoudown

    shoudown表示线程池准备关闭,不接受新任务,但可以处理任务队列中的任务。

    下面动画演示shoudown状态,这是一个正在运行的线程池,

    当我们调用shoudown方法时,现成池的状态就由running变为shoudown,

    所有提交的任务都会被拒绝,

    但是池中正在执行的任务依然会继续执行完,

    这也包括任务队列中还未执行的任务,

    当队列中的任务都执行完时,线程池状态会由shoudown变为tidying。

     stop

    看完shoudown状态,再来看下一个状态,stop。他表示线程池准备关闭,不接受新任务,也不处理任务对接中的任务,还中断正在执行任务的线程。

    下面动画演示 stop状态,这是一个正在运行的线程池,

    当我们调用shoudownNow方法时,线程池状态由running变为stop,

    所有提交的先入一律都会被拒绝,而且池中所有正在执行的任务都会被终止。 



    不仅如此,任务队列中的任务还会返回给调用者,

    调用者拿到返回的任务以后可以继续执行完,他们现在可以看到线程池变为了一座空线程,

    下一步就是将这座空城清理掉,shoudown与stop都是在为关闭线程池做准备工作.

    tidying

    下一个状态tidying则是线程池正在关闭的状态,此时所有任务已终止,线程池中的线程数量为0。

    下面动画演示tidying状态,当所有任务都已终止,且池中工作线程数量也为零时,

    状态由shoudown或stop变为tidying,

    此刻的状态表示收尾工作已完成。

     termineted

    再来看看最后一个状态,termineted的。他表示线程池彻底关闭,

    下面动画演示termineted的状态,在收尾工作完成以后,最后调用 termineted的方法彻底将限线程关闭。 



    至此我们看到了线程池每个状态的变化过程

     限制池生命周期

    限制池生命周期也可以画出来了,线程池最初的状态是running,此时线程池正在运行,

    调用shoudown方法以后状态由running变为shoudown,此时线程值准备关闭,让线程池由正在运行变为准备关闭。

    还有一种方式,那就是调用shoudownnow方法,状态由running变为stop,

    在准备工作做完以后就可以开始清理工作了,状态由shoudown变为tidying,需要任务队列为空,工作线程数量为0,

    也就是要执行完其中所有任务,包括任务队列中的任务状态

    由stop变为tidying,只需工作线程数量为0,任务队列中的任务已经返回给调用者了,不需要清空任务队列,

    最后就用 termineted方法即可让状态由tidying变为termineted,此时的线程池已经彻底完毕。 

    总结

    最后总结一下本节内容,本节介绍了线程池状态及生命周期各状态代表的意思,这里就不再赘述了。另外线程池生命周期如图所示,大家如果有需要的话可以截屏保存下来,这些内容在面试中经常会被问到。 

     

    附录:

    笔记完整文本:

    线程池在其生命周期中会经历多种状态,这些状态被定义在threadPoolExecutor中,一共有5种。这些状态所对应的描述如图所示,下面几小节将介绍这些状态。首先来看第一个状态,running,他表示线程池正在运行,可以接受新任务,并且也能处理任务队列中的任务,下面动画演示running状态,这是一个正在运行的线程池。其中有4个正在执行任务的线程,任务队列中还有2个未执行的任务,队列还有空位,我们可以继续向线程池中提交新任务,如果池中没有空闲的线程,那么新任务将会被放入任务队列中,当线程执行完任务时,他们会从任务对应中获取任务,继续执行,直到所有任务全部执行完毕,看完running状态,再来看下一个状态。 shoudown表示线程值准备关闭,不接受新任务,但可以处理任务队列中的任务。下面动画演示shoudown状态,这是一个正在运行的线程池,当我们调用shoudown方法时,现成池的状态就由running变为shoudown,所有提交的任务都会被拒绝,但是池中正在执行的任务依然会继续执行完,这也包括任务队列中还未执行的任务,当队列中的任务都执行完时,线程池状态会由shoudown变为tidying。看完shoudown状态,再来看下一个状态,stop。他表示线程池准备关闭,不接受新任务,也不处理任务对接中的任务,还中断正在执行任务的线程。下面动画演示 stop状态,这是一个正在运行的线程池,当我们调用shoudown方法时,线程池状态由running变为stop,所有提交的先入一律都会被拒绝,而且池中所有正在执行的任务都会被终止。 不仅如此,任务队列中的任务还会返回给调用者,调用者拿到返回的任务以后可以继续执行完,他们现在可以看到线程池变为了一座空线程,下一步就是将这座空城清理掉,shoudown与stop都是在为关闭线程池做准备工作,下一个状态tidying则是线程池正在关闭的状态,此时所有任务已终止,线程池中的线程数量为0。下面动画演示tidying状态,当所有任务都已终止,且时钟工作建成数量也为零时,状态由shoudown或stop变为tidying,此刻的状态表示收尾工作已完成。再来看看最后一个状态,termineted的。他表示线程池彻底关闭,下面动画演示termineted的状态,在收尾工作完成以后,最后调用 termineted的方法彻底将限线程关闭。 至此我们看到了线程池每个状态的变化过程,限制池生命周期也可以画出来了,线程池最初的状态是running,此时线程池正在运行,调用shoudown方法以后状态由running变为shoudown,此时线程值准备关闭,让线程池由正在运行变为准备关闭。还有一种方式,那就是调用shoudownnow方法,状态由running变为stop,在准备工作做完以后就可以开始清理工作了,状态由shoudown变为tidying,需要任务队列为空,工作线程数量为0,也就是要执行完其中所有任务,包括任务队列中的任务状态,由stop变为tidying,只需工作线程数量为0,任务队列中的任务已经返回给调用者了,不需要清空任务队列,最后就用 termineted方法即可让状态由tidying变为termineted,此时的线程池已经彻底完毕。 最后总结一下本节内容,本节介绍了线程池状态及生命周期各状态代表的意思,这里就不再赘述了。另外线程池生命周期如图所示,大家如果有需要的话可以截屏保存下来,这些内容在面试中经常会被问到。

     

  • 相关阅读:
    重构机房收费系统总结1之配置文件+反射+抽象工厂
    win7 下jenkins配置与使用
    ant-jmeter批量脚本
    ant批量运行Jmeter脚本遇到 Content is not allowed in prolog.问题及解决方案
    JMeter学习笔记--JMeter前置处理器
    JMeter学习笔记--详解JMeter定时器
    JMeter学习笔记--详解JMeter配置元件
    JMeter学习笔记--详解JMeter逻辑控制器
    JMeter学习笔记--JMeter监听器
    JMeter学习笔记--创建数据库测试计划
  • 原文地址:https://www.cnblogs.com/cj8357475/p/16031337.html
Copyright © 2020-2023  润新知