Java线程中断机制

概述

中断代表线程状态, 每个线程都会有一个中断状态, 用boolean表示, 初始值为false, 而线程的中断其实就是修改这个中断状态为true的过程.

中断只是一个状态, 并不能决定线程的运行.

  • 假设当前线程处于阻塞等待状态, 例如调用了wait()、join()、sleep()方法后, 调用线程的interrupt()方法, 此时中断状态被置为true, 线程会立马退出阻塞并抛出InterruptedException, 抛出异常后会将中断标志位重新设为false.
  • 假设当前线程处于运行状态, 在调用线程的interrupt()方法后, 此时中断状态被置为true, 但是线程并不会结束运行, 需要在线程的具体执行逻辑中调用isInterrupted()检测线程中断状态, 主动响应中断.

我们来看下Thread类中有关中断操作相关的方法, 具体功能已经在代码注释中说明.

// 设置一个线程的中断状态为true
public void interrupt() {}

// 检测线程中断状态,处于中断状态返回true, 该方法不会清理中断标志位
public boolean isInterrupted() {
   return isInterrupted(false);
}

// 注意⚠️:这是个静态方法,检测是否中断
// 注意⚠️:这个方法返回中断状态的同时,会将线程中断标志位重置为false
public static boolean interrupted() {
   return currentThread().isInterrupted(true);
}

// native方法,ClearInterrupted表示是否清理中断标志位
private native boolean isInterrupted(boolean ClearInterrupted);

使用线程中断来终止线程运行

方法一:通过抛出InterruptedException异常来终止线程运行

public class Test1 {
    public static void main(String[] args) throws Exception {
        MyThread myThread = new MyThread();
        myThread.start();
        Thread.sleep(1000);
        myThread.interrupt();
    }

    private static class MyThread extends Thread {
        int i = 0;

        @Override
        public void run() {
            while (true) {
                System.out.println(i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("线程被中断, 中断状态 = " + this.isInterrupted());
                    return;
                }
                i++;
            }
        }
    }
}

方法二:通过检测线程中断状态终止程序运行

public class Test2 {
    public static void main(String[] args) throws Exception {
        Thread myThread = new MyThread();
        myThread.start();
        Thread.sleep(1000);
        myThread.interrupt();
    }

    private static class MyThread extends Thread {
        int i = 0;

        @Override
        public void run() {
            //while (!this.isInterrupted()) {
            //    System.out.println(i);
            //}
            while (!Thread.interrupted()) {
                System.out.println(i);
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值