上一篇文章讲到了多线程编程中遇到的两个问题:资源竞争;线程通信,本篇文章来说一下线程的interrupted机制
Thread类中的三个interrupt方法
- 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();
}
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();
}
总结:
- 用于判断线程中断状态,并清除中断状态
- 静态方法,一般用于判断当前线程的中断状态