终止模式之两阶段终止模式
在一个线程 T1 中如何 “优雅” 终止线程 T2 ?
1. 利用 isInterrupted
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 {
// 减少服务器压力
TimeUnit.SECONDS.sleep(1);
// 执行监控
System.out.println("监控服务器!");
} catch (InterruptedException e) {
//e.printStackTrace();
current.interrupt();
}
}
}, "monitor");
monitor.start();
}
public void stop(){
monitor.interrupt();
}
}
调用
public static void main(String[] args) throws InterruptedException {
TwoPhaseTermination termination = new TwoPhaseTermination();
termination.start();
TimeUnit.SECONDS.sleep(3);
termination.stop();
}
结果
监控服务器!
监控服务器!
监控服务器!
料理后事!
2. 利用停止标记
public class TPTVolatile {
// 使用 volatile 是为了在多个线程之间使变量可见
private Thread monitor;
private volatile boolean stop = false;
public void start(){
monitor = new Thread(() -> {
while (true){
Thread current = Thread.currentThread();
if(stop){
System.out.println("料理后事!");
break;
}
try {
// 减少服务器压力
TimeUnit.SECONDS.sleep(1);
// 执行监控
System.out.println("监控服务器!");
} catch (InterruptedException e) {
//e.printStackTrace();
current.interrupt();
}
}
}, "monitor");
monitor.start();
}
public void stop(){
stop = true;
monitor.interrupt();
}
}
);
}
public void stop(){
stop = true;
monitor.interrupt();
}
}
结果同上