当某方法抛出InterruptedException时,表示该方法是一个阻塞方法,如果这个方法被中断,那么它将努力提前结束阻塞状态
Thread提供了interrupt方法,用于中断线程或者查询线程是否已经中断,每个线程都有一个布尔类型的属性,表示线程的中断状态,当中断线程时将设置这个状态
中断是一种协作机制,一个线程不能强制其他线程停止正在执行的操作而去执行其他的操作,当线程a中断b时,a仅仅是要求b在执行到某个可以暂停的地方停止正在执行的操作,前提是b愿意停止下来。
当在代码中调用了一个将抛出InterruptedException异常的方法时,你自己的方法也就变成了一个阻塞方法,并且必须要处理对中断的响应,两种处理方式
1.传递InterruptedException,
避开这个异常通常是,把异常传递给调用者,接受者选择直接上抛,或者做处理然后上抛
2.恢复中断
有时候不能抛出异常,比如代码是Runnable的一部分,在这些情况下,必须捕获InterruptedException,并通过调用当前线程上的interrupt方法恢复中断状体,在调用栈中更高层的代码引发一个中断
public class TaskRunnable implements Runnable{
BlockingQueue<Task> queue;
...
public void run(){
try{
processTask(queue.take());
}catch(InterruptedException e){
//恢复被中断的状态
Thread.currentThread().interrupt();
}
}
}