Java 中断InterruptedException的catch子句中的线程的原因是什么?

Java 中断InterruptedException的catch子句中的线程的原因是什么?,java,multithreading,interrupt,Java,Multithreading,Interrupt,我正在阅读J.Bloch的《高效Java》,现在我在解释并发性的部分。作者提供了以下示例(进行了一些修改以使其更简单): 可运行操作; //... executor.execute(新的Runnable(){ 公开募捐{ 准备好了。倒计时(); 试一试{ start.wait(); action.run(); }捕捉(中断异常e){ Thread.currentThread().interrupt();//是的,没错 当从阻塞方法抛出中断异常时,中断标志被清除 正确的做法是重置中断标志(即再次中

我正在阅读J.Bloch的《高效Java》,现在我在解释并发性的部分。作者提供了以下示例(进行了一些修改以使其更简单):

可运行操作;
//...
executor.execute(新的Runnable(){
公开募捐{
准备好了。倒计时();
试一试{
start.wait();
action.run();
}捕捉(中断异常e){
Thread.currentThread().interrupt();//是的,没错

当从阻塞方法抛出
中断异常时,中断标志被清除

正确的做法是重置中断标志(即再次中断)并尽快停止运行。重置中断标志是必要的,以便让执行器(或任何其他调用代码)知道线程已被中断,从而使其停止运行。

是的,这是正确的

当从阻塞方法抛出
中断异常时,中断标志被清除


正确的做法是重置中断标志(即再次中断)并尽快停止运行。重置中断标志是让执行器(或任何其他调用代码)知道线程已被中断,因此允许它停止运行。

作者给出了什么解释?出于好奇,线程的中断标志在catch中说了什么?可能是清除的。作者给出了什么解释?出于好奇,线程的中断标志在catch中说了什么?可能是清除的ed.非常感谢。但有一点需要澄清。当从阻塞方法抛出InterruptedException时,中断标志被清除是因为标准化或重新设置中断标志只是一种“防御编程”?好吧,这并不能保证(特别是考虑到任何人都可以抛出InterruptedException).但是JDK阻塞方法都能做到这一点(仍然是AFAIK).Semaphore和CountDownLatch,例如,明确记录了该行为。如果吞下InterruptedException,则会阻止线程正确停止。停止线程需要为被停止的线程进行协作。如果此线程不通过吞下InterruptedException进行协作,则事情不会按其方式工作应该继续。“停止线程需要被停止线程的协作”-你能给出一些例子来更好地理解这一点吗?OP问题中的代码就是一个例子。你不能强迫线程停止。你所能做的就是通过中断它来要求它停止。线程中的代码需要定期检查它是否被中断,并正确处理InterruptedException,以便从它的线程返回尽快运行方法(但可能是在清理完需要清理的内容后:关闭流,使对象处于一致状态等)。非常感谢。但有一点需要澄清。当从阻塞方法抛出InterruptedException时,中断标志被清除,即断开标志的标准化或重新格式化只是一个简单的过程“防御性编程”?AFAIK,这不是保证(特别是考虑到任何人都可以抛出InterruptedException)。但是JDK阻塞方法都可以做到这一点(仍然是AFAIK).Semaphore和CountDownLatch,例如,明确记录了该行为。如果吞下InterruptedException,则会阻止线程正确停止。停止线程需要为被停止的线程进行协作。如果此线程不通过吞下InterruptedException进行协作,则事情不会按其方式工作停止线程需要被停止线程的协作"-你能给出一些例子来更好地理解这一点吗?OP问题中的代码就是一个例子。你不能强迫线程停止。你所能做的就是通过中断它来要求它停止。线程中的代码需要定期检查它是否被中断,并正确处理InterruptedException,以便从它的线程返回尽快运行方法(但可能是在清理完需要清理的内容后:关闭流,让对象保持一致状态等)。
Runnable action;
//...
executor.execute(new Runnable() {
    public void run() {
    ready.countDown();
        try {
            start.await();
            action.run();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt(); // <------- Here
        } finally {
            done.countDown();
        }
    }
});