Two-phase Termination模式通过将停止线程分解为准备阶段和执行阶段两个阶段,提供了一种通用的优雅停止线程的方法。
准备阶段:通知目标线程准备进行停止。
- 设置标志变量。
- 调用目标线程的interrupt方法。
- 对于能够对interrupt方法调用做出响应的方法,目标线程代码可以通过捕获这些方法的InterruptException来侦测线程停止信号。
- 对于不对interrupt方法调用做出响应的方法,需要手动处理。
执行阶段:检查准备阶段设置的线程停止标志和信号,在此基础上决定线程停止的时机,并进行适当的“清理”操作。
类图
用户线程在系统停止过程中,如果没有停止则会阻止JVM正常关闭。所以,在系统停止过程中我们必须主动停止用户线程,而非依赖JVM。
Two-phase Termination模式使得我们可以对各种形式的目标线程进行优雅的停止。如目标线程调用了能够对interrupt方法调用做出响应的阻塞方法、目标线程调用了不能对interrupt方法调用做出响应的阻塞方法、目标线程作为消费者处理其他线程生产的“产品”在其停止前需要处理完现有“产品”等。
JAVA标准库实例
ThreadPoolExecutor