关闭线程池shutdown 和 shutdownNow 的区别

ThreadPoolExecutor 中关闭线程池的方法

关闭线程池shutdown 和 shutdownNow 的区别

 判断线程池状态的方法

关闭线程池shutdown 和 shutdownNow 的区别

shutdown()

调用 shutdown() 方法之后线程池并不是立刻就被关闭,因为这时线程池中可能还有任务正在执行,或是任务队列中有正在等待的任务,它会等待正在执行的任务和队列中等待的任务执行完毕后才彻底关闭。

注意:调用 shutdown() 方法后如果还有新的任务被提交,线程池则会根据拒绝策略直接拒绝提交的任务。

shutdownNow()

shutdownNow() 表示立刻关闭的意思。在执行 shutdownNow 方法之后,首先会给所有线程池中的线程发送 interrupt 中断信号尝试中断这些任务的执行,然后将任务队列中的任务转移到一个 List 中并返回

注意:即便我们调用了 shutdownNow 方法,如果被中断的线程对于中断信号不理不睬,那么依然有可能导致任务不会停止。所以我们自己编写的线程应当具有响应中断信号的能力。

 

isShutdown()

isShutdown(),它可以返回 true 或者 false 来判断线程池是否已经开始了关闭工作,也就是是否执行了 shutdown 或者 shutdownNow 方法。

注意:如果调用 isShutdown() 返回的结果为 true 并不代表线程池此时已经彻底关闭了,这仅仅代表线程池开始了关闭的流程,也就是说,此时可能依然有线程在执行任务,队列里也可能有等待的任务。

isTerminated()

isTerminated()方法可以检测线程池是否真正“终结”了,这不仅代表线程池已关闭,同时代表线程池中的所有任务都已经都执行完毕了。

因为我们刚才说过,调用 shutdown 方法之后,线程池会继续执行里面未完成的任务,不仅包括线程正在执行的任务,还包括正在任务队列中等待的任务。比如此时已经调用了 shutdown 方法,但是有一个线程依然在执行任务,那么此时调用 isShutdown 方法返回的是 true ,而调用 isTerminated 方法返回的便是 false ,因为线程池中还有任务正在在被执行,线程池并没有真正“终结”。直到所有任务都执行完毕了,调用 isTerminated() 方法才会返回 true,这表示线程池已关闭并且线程池内部是空的,所有剩余的任务都执行完毕了。

awaitTermination()

调用 awaitTermination 方法后当前线程会尝试等待一段指定的时间,如果在等待时间内,线程池已关闭并且所有已提交的任务(包括正在执行的和队列中等待的)都执行完毕,也就是说线程池真正“终结”了,那么方法就返回 true,否则超时返回 fasle。

如果等待期间线程被中断,方法会抛出 InterruptedException 异常。