两阶段终止模式

两阶段终止模式

解决的问题:

在一个线程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();
    }
}

 

 

 

posted @ 2021-08-23 11:32  mcalex  阅读(84)  评论(0编辑  收藏  举报