线程中断的方式

线程中断的方式我在这篇文章多线程基本操作有解释过。这篇文章单独抽离出来

共享变量的方式

public class MyThread implements Runnable {
    //使用volatile关键字可以做到变量的可见性,后续会详细的解释
    static volatile boolean flag = false;
     @Override
    public void run() {
       while (true){
           System.out.println("正在执行");
           if(flag){
               break;
           }
       }
    }

    public static void main(String[] args) {
     new Thread(new MyThread()).start();
        try {
            Thread.sleep(2000);//主线程睡眠确保另一个线程先执行
            flag = true; //修改变量的值
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

该方法注意事项:

使用变量中断的话,该变量需要用volatile关键字修饰,保证变量的可见性

使用Thread提供的方法

void   interrupt()       //中断线程
static boolean    interrupted() //测试当前线程是否已经中断
boolean  isinterrupted()    //测试线程是否已经中断
线程中断返回true,否则返回false

用法详细解释

interrupt()方法作为一个实例方法
通知目标线程中断(将线程的中断标志设置为true)
如果线程在调用Object类的wait()…方法或者目标线程的join(…)、sleep(…)方法时
会抛出InterruptedException,并将中断状态清除(中断状态设为false)!!!

isinterrupted()方法是一个实例方法,判断当前线程是否中断(查看中断标志true(中断)\false(未中断))


interrupted()方法是一个静态方法,也用来判断当前线程是否中断,但是和isinterrupted不同的是,它会清除中断状态(置为false)。
换句话说:中断状态可以由interrupted清除,连续调用两次interrupt方法会返回false.

//interrupt()中断线程演示
public class MyThread implements Runnable {
    @Override
    public void run() {
       while (true){   //定义一个死循环,使用线程中断来结束循环。
           System.out.println("正在执行");
           if(Thread.interrupted()){ //判断该线程是否是中断线程
               break;
           }
       }
    }

    public static void main(String[] args) {
     Thread thread = new Thread(new MyThread());
        try {
            thread.start();
            Thread.sleep(2000);//保证那个线程先执行
            thread.interrupt();//线程中断,设置中断状态为true
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

线程阻塞时使用:

public class MyThread implements Runnable {
    @Override
    public void run() {
       while (true){   //定义一个死循环,使用线程中断来结束循环。
           System.out.println("正在执行");
        try {
            Thread.sleep(2000);//保证那个线程先执行
        } catch (InterruptedException e) {
            e.printStackTrace();
            this.interrupt();
        }
           if(Thread.interrupted()){ //判断该线程是否是中断线程
               break;
           }
       }
    }

    public static void main(String[] args) {
     Thread thread = new Thread(new MyThread());
        try {
            thread.start();
            thread.interrupt();//线程中断,设置中断状态为true
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

注意事项:sleep抛出InterruptException异常后,会将该线程的中断状态清除即设置为false;因此需要在异常中再次调用interrupt()方法一次。

切记:
Thread.interrupted()方法以及sleep发生异常抛出的interruptException异常都会清除中断标记。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值