相关博客:

Java 线程池,isShutDown、isTerminated 的作用与区别

 

关闭线程池有两种方式,可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池。它们的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务可能永远无法终止。

线程池shutdown和shutdownNow的区别_Java

线程池shutdown和shutdownNow的区别_线程池_02

中断原理:

线程池shutdown和shutdownNow的区别_Java_03

线程池shutdown和shutdownNow的区别_参考资料_04

关于线程池状态可以参看

void shutdown():不会立即终止线程池,首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程。此时,则不能再往线程池中添加任何新的任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。

List<Runnable> shutdownNow():将线程池的状态设置成SHUTDOWN状态,立即终止线程池,并且尝试打断正在运行的线程,清空缓存队列中的任务,返回尚未开始的任务。

只要调用了这两个关闭方法中的任意一个,isShutdown方法就会返回true。当所有的任务都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法会返回true。至于应该调用哪一种方法来关闭线程池,应该由提交到线程池的任务特性决定,通常调用shutdown方法来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow方法。