关于Thread的interrupt

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Thread的interrupt相关的知识,希望对你有一定的参考价值。

关于Thread的interrupt

  1. Thread的interrupt方法会引发线程中断。

    主要有以下几个作用:

    • 如Object的wait方法,Thread的sleep等等这些能够抛出InterruptedException异常的方法,在遇到调用对应线程的interrupt方法后就会抛出InterruptedException异常。抛出InterruptedException时同时会重置中断状态

      如下面代码

              Thread t=new Thread(()->{
                  try {
                      Thread.sleep(10000);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  //由于InterruptedException异常清空了中断状态,这里的Thread.interrupted()返回的是false
                    System.out.println("interrupt statu: "+Thread.interrupted());
              });
              t.start();
              Thread.sleep(3000);
              t.interrupt();
              Thread.currentThread().join();
      
      • LockSupport.park在使当前线程暂停后,调用interrupt方法也会使线程重新唤醒,执行后续代码。

2、关于Thread的isInterrupted方法

public static boolean isInterrupted()
public boolean isInterrupted()

上面两个方法都是检测线程是否被中断,也就是是否调用了interrupt方法。内部都是调用了native方法isInterrupted。

    /**
     * Tests if some Thread has been interrupted.  The interrupted state
     * is reset or not based on the value of ClearInterrupted that is
     * passed.
     */
//测试线程是否已被中断。 由于ClearInterrupted的值来决定是否重置中断状态。
 private native boolean isInterrupted(boolean ClearInterrupted);

但是有一些区别

public static boolean interrupted() {
    return currentThread().isInterrupted(true);
}

这个静态方法使判断当前线程是否被中断,isInterrupted里面的入参是true,表示清空中断状态,也就是如果对应线程调用了interrupt进行了中断后,如果连续调用这个方法两次返回值是不一样的,第一次返回true,第二次返回false。因为第一次调用时会重置中断状态。


    public boolean isInterrupted() {
        return isInterrupted(false);
    }

这个方法isInterrupted里面的入参是false,不会重置中断状态。也就是如果对应线程调用了interrupt进行了中断后,如果连续调用两次这个方法返回值都是一样的,都是false。

如果在调用interrupt进行中断的线程结束后,调用上述两个中断检测,返回值也是false

以上是关于关于Thread的interrupt的主要内容,如果未能解决你的问题,请参考以下文章

isInterrupted()方法和Thread.interrupted()方法判断中断状态的区别

Thread的interrupt()方法

boost::this_thread::interruption_point() 不会抛出 boost::thread_interrupted& 异常

非常棒) Thread的中断机制(interrupt)

线程中断:Thread类中interrupt()interrupted()和 isInterrupted()方法详解

svn报错cleanup failed–previous operation has not finished; run cleanup if it was interrupted的解决办法(代码片段