在Java中,线程池的状态和线程的状态是完全不同的。线程有6种状态:NEW:初始化状态,RUNNABLE:可运行/运行状态,BLOCKED:阻塞状态,WAITING:无时间限制的等待状态,TIMED_WAITING:限时等待状态和TERMINATED:终止状态。线程池的状态有以下五种:RUNNING:运行状态,线程池创建后会进入这个状态,如果不手动调用shutdown方法,整个程序过程中线程池都处于这个状态跑步。SHUTDOWN:关闭状态,不会接受新的任务提交,但是会处理已经存在任务队列中的任务。STOP:在停止状态下,不再接受新的任务提交,当前正在执行的任务将被中断,任务队列中已有的任务将被放弃。TIDYING:正在整理状态,所有任务执行完毕(包括任务队列中的任务执行完毕),当前线程池中活跃线程数降为0时的状态。到达该状态后,会调用terminated()方法线程池将被调用。TERMINATED:销毁状态,执行完线程池的terminated()方法后就会变成这个状态。这5种状态可以在ThreadPoolExecutor源码中找到,如下图所示:线程池状态转换线程池状态转换有两条路径:当调用shutdown()方法时,线程池的状态会发生变化从RUNNING到SHUTDOWN,再到TIDYING,最后到TERMENATED销毁状态。当调用shutdownNow()方法时,线程池的状态会从RUNNING变为STOP,再变为TIDYING,最后变为TERMENATED销毁状态。线程状态转换过程如下图所示:terminated方法线程池中的terminated()方法,即线程池从TIDYING状态转换到TERMINATED状态时调用的方法,默认为空。其源码如下:我们可以在创建线程池中重写terminated()方法,具体实现代码如下:util.concurrent.TimeUnit;publicclassThreadPoolStateTransition{publicstaticvoidmain(String[]args)throwsInterruptedException{//创建线程池ThreadPoolExecutorthreadPool=newThreadPoolExecutor(10,10,0L,TimeUnit.SECONDS,newLinkedBlockingQueue<>(100)){@Overrideprotectedvoidterminated(){超级。终止();System.out.println("执行终止()方法");}};//关闭线程池threadPool.shutdown();//在退出之前等待线程池完成执行while(!threadPool.awaitTermination(1,TimeUnit.SECONDS)){System.out.println("线程池正在运行");}}}总结线程池有5种状态:RUNNING:运行状态SHUTDOWN:关闭状态STOP:停止状态TIDYING:结束状态TERMINATED:销毁状态默认情况下,如果不调用shutdown方法,线程池会一直处于RUNNING状态,有两种线程池状态转移方式一种途径:当shutdown()方法被调用时,线程池的状态会从RUNNING变为SHUTDOWN,再变为TIDYING,最后变为TERMENATED销毁状态;当调用shutdownNow()方法时,线程池的状态会从RUNNING变为STOP,再变为TIDYING,最后变为TERMENATED销毁状态。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview
