简单记录线程池和线程的关闭
发现网上很少有关于线程关闭的文档,正好也在看这个东西,现在来做个简单的记录
线程池的关闭
首先看线程池ThreadPoolExecutor的关闭方法
线程池的关闭主要有两个方法:shutdown和shutdownNow两个,但是两个方法还是有很大的区别的
shutdown:官方给出的解释是“按过去执行已提交任务的顺序发起一个有序的关闭,但是不接受新任务”,也就是说执行这个方法的时候线程池并不是立即关闭,而是还会把已经有的线程执行完毕,只不过不会再接受新的任务。
shutdownNow:官方给出的解释是“尝试停止所有的活动执行任务、暂停等待任务的处理,并返回等待执行的任务列表,尝试停止所有的活动执行任务、暂停等待任务的处理,并返回等待执行的任务列表。在从此方法返回的任务队列中排空(移除)这些任务。并不保证能够停止正在处理的活动执行任务,但是会尽力尝试。 此实现通过 Thread.interrupt()
取消任务,所以无法响应中断的任何任务可能永远无法终止。”,注意措辞是尝试,也就是说也不一定能立即关闭,那么我们现在来看源代码
再往底层我们先不管,下边我们来看interrupt官方给出的解释,
如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。
如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。
如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。
如果以前的条件都没有保存,则该线程的中断状态将被设置。
中断一个不处于活动状态的线程不需要任何作用。
相信看到这里我们就已经了解了。
线程的关闭
线程的关闭sun给出了好多的方法,有stop、suspended、interrupt,前面的两种已经被设置为过时,所以本人觉得最有可能用到的只有interrupt方法,而interrupt方法,上边已经给出了解释。
但是我没有看到能够立即停止线程的一个方法,不知道是怎么回事,如果有人知道请不吝赐教一下,非常感谢!
通过翻阅《并发编程的艺术》,又找到了一种方法,通过设置标志位来结束,但是这种方法得是在一些合适的场合才行,比如在run方法中有while(ture)方法,我们可以通过设置标志位,来破坏这个条件来达到优雅的终止线程的方法,因为这种方式能够使线程在终止时有机会去清理资源。