
线程池的状态有以下 5 种:
1、RUNNING:运行状态,线程池创建好之后就会进入此状态,如果不手动调用关闭方法,那么线程池在整个程序运行期间都是此状态。
2、SHUTDOWN:关闭状态,不再接受新任务提交,但是会将已保存在任务队列中的任务处理完。
3、STOP:停止状态,不再接受新任务提交,并且会中断当前正在执行的任务、放弃任务队列中已有的任务。
4、TIDYING:整理状态,所有的任务都执行完毕后(也包括任务队列中的任务执行完),当前线程池中的活动线程数降为 0 时的状态。到此状态之后,会调用线程池的 terminated() 方法。
5、TERMINATED:销毁状态,当执行完线程池的 terminated() 方法之后就会变为此状态。

Java线程池ThreadPoolExecutor提供了三个重要的方法shutdown()、shutdownNow()和awaitTermination():
shutdown:拒绝新任务提交到线程池,待执行与正在执行的任务继续执行。
shutdownNow:拒绝提交新任务到线程池,取消队列中等待执行的任务,尝试取消正在执行任务。
awaitTermination(long timeOut, TimeUnit unit):阻塞线程,等待所有待执行以及正在执行的任务执行完成,或者等到超时,或者线程被中断抛出中断异常,然后返回true或false(表示已超时)
这三个方法的区别是:
shutdown与shutdownNow之后都拒绝提交任务,awaitTermination可以继续提交任务。
awaitTermination是阻塞的,返回结果是线程池是否已停止(true/false)shutdown/Now不阻塞。
shutdownNow是立即关闭,而shutdown是优雅关闭。
确定优雅关闭线程的步骤:
(1)执行shutdown方法,等待所有任务执行完毕并拒绝新任务的提交。
(2)执行awaitTermination(long timeout,TimeUnit unit),指定超时时间,判断是是否已经关闭所有任务,防止线程永远无法关闭。
(3)如果第2步返回fasle,或者被中断。调用shutDownNow方法立即关闭线程池所有任务。