关闭线程池的正确姿势,shutdown(), shutdownNow()和awaitTermination() 该怎么用?
ExecutorService 接口提供了三个方法用于手动关闭线程池,分别是 shutdown() , shutdownNow() 和 awaitTermination() 。我们最经常使用的 ThreadPoolExecutor 正是 ExecutorService 的实现类,自然也实现了这些方法。相信有很多小伙伴都没搞明白这些方法的区别,也不清楚在不同的情况下应该使用哪个方法。本文将通过 ThreadPoolExecutor 源码分析和简单用例向你展示这些方法的区别联系和使用场景,很多重点都在代码块的注释中,注意看哦!话不多说,上源码。 一、源码分析 1.1 线程池运行状态 ThreadPoolExecutor 使用 runState (运行状态)这个变量对线程池的生命周期进行控制,线程池关闭过程会有频繁的运行状态转化,所以我们首先需要了解线程池的各种运行状态及其之间的转化关系, runState 一共有以下5种取值: RUNNING:接收新的任务并对任务队列里的任务进行处理; SHUTDOWN:不再接收新的任务,但是会对任务队列中的任务进行处理; STOP:不接收新任务,也不再对任务队列中的任务进行处理,并中断正在处理的任务; TIDYING:所有任务都已终止,线程数为0,在转向 TIDYING 状态的过程中,线程会执行 terminated() 钩子方法