Java线程-两阶段终止模式(interrupted实现)

最近刚开始学线程。

任务

使用sleep,interrupt实现在这里插入图片描述


import org.apache.log4j.Logger;
import static java.lang.Thread.sleep;
public class Demo{
    public static void  main(String[] agrs) throws InterruptedException {
        TwoPhaseTerminate pt=new TwoPhaseTerminate();
        pt.start();
        
        //分给monitor线程时间片后,monitor开始运行。
		//此时main和monitor线程并行
		
        Thread.sleep(5000);//main线程睡眠5s,monitor还在运行
        pt.stop();//main睡眠结束,调用结束方法。线程monitor结束

    }
}
class TwoPhaseTerminate{
    private static Logger logger = Logger.getLogger(TwoPhaseTerminate.class);
    private Thread monitor;

    public void start(){
        monitor=new Thread(()->{
            while(true){
                Thread current= Thread.currentThread();
                if(current.isInterrupted()){
                    logger.debug("退出监控");
                    break;
                }
                try {
                    Thread.sleep(2000);//state 1:这里打断,打断标记会被清除
                    logger.debug("监控中");//state 2:在这里打断没事。

                } catch (InterruptedException e) {
                    e.printStackTrace();
                    current.interrupt();
                    //鉴于state 1,在睡眠时打断,标记会被清除
                    //所以可以在打断一次。这样打断标记就是true
                    //没有这一句的话,线程会一直运行下去。(不考虑main线程的睡眠时间,
                    //因为可能刚好在state 2 打断。
                }
            }
        },"monitor");
        monitor.start();//main线程调用
    }

    public void stop(){
        monitor.interrupt();
    }
}

结果如下
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值