今天看书,看到线程池的关闭方式,记个笔记
线程池大家都知道,用来实现资源复用的。避免了线程频繁的创建和销毁的开销。待到使用完毕后都要关闭线程池,以释放资源。
线程池关闭后里面有任务正在工作的线程会怎么样
在书上有这么一段:
可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池。它们的原理是遍历线 程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务 可能永远无法终止。但是它们存在一定的区别,shutdownNow首先将线程池的状态设置成 STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而 shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。
只要调用了这两个关闭方法中的任意一个,isShutdown方法就会返回true。当所有的任务 都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法会返回true。至于应该调用哪 一种方法来关闭线程池,应该由提交到线程池的任务特性决定,通常调用shutdown方法来关闭 线程池,如果任务不一定要执行完,则可以调用shutdownNow方法。
总结
线程池有两种关闭方法(shutdownNow和shutdown),shutdownNow会首先将线程池的状态设置成 STOP,然后尝试停止所有的正在执行或暂停任务的线程;shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。
我的理解是shutdownNow方法不管线程池中的线程在不在工作,会尝试关闭所有线程,shutdown方法只会关闭没有工作的线程会等待有工作的线程执行完毕。但是只有等所有线程都不在工作并且被成功中断后线程池才会真正意义上的关闭。