一、两阶段终止模式(Two Phase Termination)
在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个料理后事的机会。
1.1 错误思路
- 使用线程对象的stop()方法停止线程。
stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁。
- 使用 System.exit(int) 方法停止线程
目的仅是停止一个线程,但这种做法会让整个程序都停止。
1.2 两阶段终止模式
public class App
{
public static void main( String[] args ) throws InterruptedException {
TwoPhaseTermination tpt = new TwoPhaseTermination();
tpt.start();
Thread.sleep(3500);
tpt.stop(); //优雅停止
}
}
/**
* 两阶段终止模式
*/
class TwoPhaseTermination{
private Thread monitor;
//启动监控线程
public void start(){
monitor = new Thread(()->{
while(true){
//监控线程是否被打断
Thread current = Thread.currentThread();
if(current.isInterrupted()){ //被打断
System.out.println("料理后事!");
break;
}
try {
Thread.sleep(1000);//此处被打断属于阻塞中被打断,会清空打断标志,因此应该捕捉异常,并将打断标志设为true
System.out.println("执行监控记录!"); //此处被打断属于运行中被打断,会至打断标志为true
} catch (InterruptedException e) {
e.printStackTrace();
//重新设置打断标志
current.interrupt();
}
}
},"T1");
monitor.start();
}
//停止监控线程
public void stop(){
monitor.interrupt(); //打断线程
}
}
二、结束
采用两阶段终止模式,可以使线程在退出之前对后事进行料理,优雅的退出线程。在设计时不应该直接粗暴的退出线程,而应该采用这种两阶段终止模式,优雅的退出线程。