两阶段终止模式
解决的问题:
在一个线程T1中优雅的终止线程T2?这里的【优雅】指的是给T2一个料理后事的机会
错误的思路:
1、调用Stop方法来停止线程
Stop方法会真正的杀死线程,但是如果这时候线程锁住了共享资源,那么当他被杀死后就再也没有机会释放锁,其他线程永远无法获取锁
2、使用System.ext()方法停止线程
这种做法会使得整个进程停止,显然有点小题大做
两阶段终止模式
假设我们需要有一个线程来监控服务器资源,每过两秒就记录一次当前服务器的状态,同时我们需要有一个中断机制来结束当前线程。我们可以讲程序的流程图归结如下
代码实现
public class Test3 { public static void main (String[] args) throws Exception{ TwoPhaseTermination tgt = new TwoPhaseTermination(); tgt.start(); Thread.sleep(3500); tgt.stop(); } } class TwoPhaseTermination{ private Thread moniter; // 启动监控线程 public void start(){ moniter = new Thread(()->{ while(true){ Thread now = Thread.currentThread(); if(now.isInterrupted()){ System.out.println(now.getName()+"处理后事"); break; } try { Thread.sleep(1000); System.out.println(now.getName()+"执行监控记录"); } catch (InterruptedException e) { e.printStackTrace(); // 重新设置打断标记 now.interrupt();; } } },"t1"); moniter.start(); } //停止监控线程 public void stop(){ moniter.interrupt(); } }