两阶段终止模式
在一个线程T1中如何“优雅”终止线程T2?这里的【优雅】指的是给 T2 一个料理后事(处理完当前的操作)的机会。
错误思路
-
使用线程对象的 stop() 方法停止线程
- stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁, 其它线程将永远无法获取锁
-
使用 System.exit(int) 方法停止线程
- 目的仅是停止一个线程,但这种做法会让整个程序都停止
两阶段终止模式
代码:
@Slf4j
public class Test02 {
public static void main(String[] args) throws InterruptedException{
TwoPhaseTermination tpt=new TwoPhaseTermination();
tpt.start();
Thread.sleep(3500);
tpt.stop();
}
}
@Slf4j
class TwoPhaseTermination{
private Thread monitor;
//启动监控线程
public void start(){
monitor=new Thread(()->{
while (true){
Thread current=Thread.currentThread();
if (current.isInterrupted()){
log.debug("料理后事");
break;
}
try{
Thread.sleep(1000);
log.debug("执行监控记录");
}catch (InterruptedException e){
e.printStackTrace();
//线程处于sleep时interrupt方法打断标记为false需要重新设置
//重新设置打断标记
current.interrupt();
}
}
});
monitor.start();
}
//停止监控线程
public void stop(){
monitor.interrupt();
}
}
执行结果: