关于Thread的interrupt
-
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();
-
interrupt调用之后再执行sleep之类,也会抛出InterruptedException异常
Thread t=new Thread(()->{ Thread.currentThread().interrupt(); try { Thread.sleep(1000); } catch (InterruptedException e) { //会抛出异常,走到这里 e.printStackTrace(); } }); t.start();
-
-
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进行了中断后,如果连续调用两次这个方法返回值都是一样的,都是true。
如果在调用interrupt进行中断的线程结束后,调用上述两个中断检测,返回值也是false