一心多用多线程-Thread的interrupt机制

使Thread中断的方式有很多种,比如调用stop()方法进行中断,但stop()方法存在线程的安全性问题,java api已经不推荐使用,那么我们想要让一个线程停止,我们可以使用java里面的interrupt机制。

在本线程,或其他线程里面可以调用具体线程的interrupt()方法,调用时是这样的,被打断的线程不会立刻被打断,只是他里面的一个状态被改变,然后靠线程自己去打断自己,即线程打断是自我打断,打断一个线程的时候,被中断线程可以通过interrupted()对状态进行检测,如果是被中断状态时,返回true,然后注意,此时的中断状态会被重置到未被打断状态,因此,被中断线程可以通过调用一次该值不做任何处理,让自己不被中断。而isInterrupted()方法不会重置清除状态。在另外的线程调用一个正在sleep(),或者wait()的线程的interrupt方法时,此时被中断线程会抛出一个错误,说明在休眠的线程中断是会被通知的,且此时的中断状态为false,也就是说中断休眠的线程是不会成功的。

我们通过下面一个例子来认识上述讲的那些点,main主线程会睡眠五秒后打断它自己的一个子线

public class ThreadInterrupt extends Thread{

    @Override
    public void run() {
        while(true){
            System.out.println("线程运行中...");
            System.out.println("线程是否被打断:"+this.isInterrupted());
            System.out.println("线程确认是否被打断:"+this.isInterrupted());
            System.out.println("---------------------");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("捕获中断异常");
                if(Thread.interrupted()){//判断是否被中断
                    System.out.println("线程在休眠中被中断");
                    System.out.println("Thread.interupted():"+Thread.interrupted());
                    break;
                }else{
                    this.interrupt();
                    System.out.println("线程并没有被中断");
                    System.out.println("线程自己调用自己的中断方法");
                    System.out.println("线程是否被打断:"+this.isInterrupted());
                    System.out.println("线程确认是否被打断:"+this.isInterrupted());
                }
            }
            if(Thread.interrupted()){//判断是否被中断
                System.out.println("线程被中断");
                System.out.println("Thread.interupted():"+Thread.interrupted());
                break;
            }
        }
    }

    public static void main(String[] args) throws InterruptedException{
        Thread thread = new ThreadInterrupt();
        thread.start();
        Thread.sleep(5000);
        thread.interrupt();
    }
}
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:true
线程确认是否被打断:true
---------------------
捕获中断异常
线程并没有被中断
线程自己调用自己的中断方法
线程是否被打断:true
线程确认是否被打断:true
线程被中断
Thread.interupted():false

以上例子论证了线程在休眠中被中断的问题,运行上面例子的时候可能会出现另外一个结果,就是刚刚好子线程动的时候就被主线程打断了,那么将会出现下面的结果:

线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:false
线程确认是否被打断:false
---------------------
线程运行中...
线程是否被打断:true
线程确认是否被打断:true
---------------------
线程被中断
Thread.interupted():false
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值