概述
在多线程中,如果我们由于一些特殊的原因,想让已经进入阻塞的线程提前解除阻塞,进而进行执行后面的代码,那么线程中断这个方法,会让我们很轻松的达到这个目的。
中断原理
Java 中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。
即在线程A中调用线程B的interrupt(),会使线程B的中断状态位置为true,线程B可以选择在合适的时候处理这个请求,也可以完全忽视这个请求。
java.lang.Thread 类提供了几个方法来操作这个中断状态,这些方法包括:
public boolean isInterrupted(){
//...
}
public void interrupt() {
//...
}
public static boolean interrupted() {
//...
}
其中
interrupt():将线程的中断状态位设置为true。仅仅这一个功能而已。
isInterrupted():判断线程是否已经中断,若已经中断返回true,否则返回false。仅仅用来判断线程是否已经被中断。
interrupted():判断当前线程是否被中断,现成的中断状态由该方法清除。若连续调用两次该方法,则第二次调用将返回false。
如何响应中断?
谈一谈我的理解,我们上面提到过,当一个线程进入阻塞状态时,由于一些特殊的原因,我们必须让这个阻塞提前解除,进而让该进程继续往下执行任务,那我们如何提前解除阻塞呢?线程中断就是一个好的方法。
当一个线程A进入阻塞时,如果其他线程调用了A的interrupt()时,此时线程A的中断状态位为变为true。并且会抛出一个InterruptException异常。我们可以通过捕获这个异常,然后进行一些相关的操作,下面是一个例子:
线程A始终在睡眠状态,线程B中调用了线程A的interrput():
class MyThread extends Thread{
public void run(){
try {
System.out.println("线程A在睡眠之前的中断状态位:" + Thread.currentThread().isInterrupted());