线程的interrupt机制

上一篇文章讲到了多线程编程中遇到的两个问题:资源竞争;线程通信,本篇文章来说一下线程的interrupted机制

Thread类中的三个interrupt方法

  1. public void interrupt()
    这是一个非静态方法,用于中断一个线程
    看两段简单的代码:
@Test
public void interruptTest1() {
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
        try {
            Thread.sleep(1);
            System.out.println("线程t1继续执行");
        } catch (InterruptedException e) {
            System.out.println("线程t1被中断");
            System.out.println("线程t1当前是否被中断:" + Thread.currentThread().isInterrupted());
        }
        }
    }, "t1");

    t1.start();

    t1.interrupt();

}
图片.png

test1方法会执行到catch的流程中,因为线程t1被主线程中断,并且Thread.sleep()响应中断,抛出异常
抛出异常后,线程的中断会被清除

@Test
public void interruptTest2() {
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            LockSupport.parkNanos(10000000);
            if(Thread.currentThread().isInterrupted()) {
                System.out.println("线程t2被中断");
            }
        }
    }, "t2");

    t2.start();

    t2.interrupt();
}

test2会执行到if判断逻辑中,同样因为线程t2被主线程中断,但是由于LockSupport.parkNanos()不响应中断,所以整个线程的执行不受影响

总结:

  • interrupt方法并不会真的中断线程,只是将线程的中断状态设置为true
  • 当调用interrupt方法后,线程是否会中断,要看线程当前正在执行的方法是否响应中断
  • 非静态方法,只能被线程对象调用

2.public boolean isInterrupted()
判断线程是否已经被中断
上面的test2方法已经用到此方法,用于判断线程中断状态标志位是否为true,非静态方法,只能被线程对象使用

3.public static boolean interrupted()
判断线程是否已经被中断,并清除中断标志

@Test
public void interruptTest3() {
    Thread t3 = new Thread(new Runnable() {
        @Override
        public void run() {
            LockSupport.parkNanos(10000000);
            if(Thread.interrupted()) {
                System.out.println("线程t3被中断");
                if(!Thread.currentThread().isInterrupted()) {
                    System.out.println("线程t3已经恢复中断");
                }
            }
        }
    }, "t3");

    t3.start();

    t3.interrupt();
}

总结:

  • 用于判断线程中断状态,并清除中断状态
  • 静态方法,一般用于判断当前线程的中断状态
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容