Java 我们为什么不接受中断例外

Java 我们为什么不接受中断例外,java,concurrency,interrupted-exception,Java,Concurrency,Interrupted Exception,我非常困惑,无法理解为什么不应该接受中断异常 IBM的文章说 当阻塞方法检测到中断并抛出InterruptedException时,它将清除中断状态。如果捕获到InterruptedException但无法重新触发它,则应保留中断发生的证据,以便调用堆栈中较高级别的代码可以了解该中断,并在需要时对其作出响应 public class TaskRunner implements Runnable { private BlockingQueue<Task> queue;

我非常困惑,无法理解为什么不应该接受中断异常

IBM的文章说

当阻塞方法检测到中断并抛出InterruptedException时,它将清除中断状态。如果捕获到InterruptedException但无法重新触发它,则应保留中断发生的证据,以便调用堆栈中较高级别的代码可以了解该中断,并在需要时对其作出响应

public class TaskRunner implements Runnable {
    private BlockingQueue<Task> queue;

    public TaskRunner(BlockingQueue<Task> queue) { 
        this.queue = queue; 
    }

    public void run() { 
        try {
             while (true) {
                 Task task = queue.take(10, TimeUnit.SECONDS);
                 task.execute();
             }
         }
         catch (InterruptedException e) { 
           Thread.currentThread().interrupt();//preserve the message
             return;//Stop doing whatever I am doing and terminate

         }
    }
}
公共类TaskRunner实现可运行{
私有阻塞队列;
公共任务运行程序(阻止队列){
this.queue=队列;
}
public void run(){
试一试{
while(true){
Task Task=queue.take(10,时间单位:秒);
task.execute();
}
}
捕获(中断异常e){
Thread.currentThread().interrupt();//保留消息
return;//停止我正在做的事情并终止
}
}
}
另外,Java并发在实践中也在第7.1.3章:响应中断中详细讨论了这一点。其规则是:

只有实现线程中断策略的代码才能吞咽中断请求。通用任务和库代码决不能接受中断请求。

1.有人能解释一下更高调用堆栈中的代码如何利用Thread.currentThread().interrupt()设置的状态吗;线程终止时在catch块中


另外,请解释上述规则?

看看这个示例,假设它在线程/线程池上下文中运行

public void run() {
  // Honor interrupts so that you can stop/kill the task
  while (!Thread.currentThread().interrupted()) {
    this.doSomeChunkOfWork();
  }    
}
上面的代码是一个很好的例子,说明了如何编写一个任务,该任务可以被中断,并以块的形式处理数据(想想从某些源读取数据并以部分的形式处理数据)。现在让我们假设
doSomeChunkOfWork
被中断,您捕获到一个异常。除非您再次设置标志或保持标志的中断状态,
run
方法将无法知道调用堆栈深处的处理在方法调用返回时被中断,这会扰乱我们良好的逻辑


这就是为什么您总是将状态设置回原来的状态,以便调用堆栈中的方法知道线程是否真的被中断了。我想打个比方说“不要扫地毯下面的灰尘”。)

“使调用堆栈上较高的代码能够了解中断的哪一部分,并在需要时对其作出响应”难道您不明白吗?@EJP代码如何了解中断以及如何处理中断。可能有一个示例会有帮助您正在同一个调用堆栈中处理中断。我想知道的是线程可以处理它。@NikhilArora:那么,你需要编辑你的问题,因为它会问“有人能解释一下在更高的调用堆栈中的代码如何利用线程设置的状态吗”。@NikhilArora:另外,如果线程“main”创建了线程“a”,那么“main”就不会意识到线程“a”的中断所以你的问题不是很清楚。@NikhilArora-线程的创建者不在所创建线程的“调用堆栈”中,因此你的陈述没有任何意义。新创建的线程有一个与创建者的调用堆栈无关的全新调用堆栈。@jtahlborn你说得对。我已经编辑了这个问题。请检查。