3

假设我有以下代码:

while(!Thread.currentThread().isInterrupted()){  
    //do something   
    Thread.sleep(5000);  
}

现在Thread.sleep抛出 `InterruptedException 所以它应该是这样的:

while(!Thread.currentThread().isInterrupted()){  
   //do something   
   try{  
     Thread.sleep(5000);    
   } catch(InterruptedException e){  

   }
}

如果我点击循环catchwhile继续还是我需要这样做Thread.currentThread().interrupt()?如果我确实调用此方法,那是否也会导致InterruptedException?否则我一开始是怎么得到异常的?

另外,如果我有:

while (!Thread.currentThread().isInterrupted()){  
   //do something   
   callMethod();  
}  

private void callMethod(){  
   //do something  
   try {  
     Thread.sleep(5000);    
   } catch(InterruptedException e){  

   }
}

我的while循环会再次中断吗?

4

3 回答 3

2

实际上,您的问题try - catch - finally 不仅仅是关于多线程。

1)如果sleep抛出一个Exception,该catch块将执行,然后while循环继续。

2)你做的事情与1)完全相同

要离开while循环,请执行以下操作:

try{  
   while(!Thread.currentThread.isInterrupted){  
       //do something   
       Thread.sleep(5000);    
   }  
}
catch(InterruptedException e){  

}

在这种情况下,如果Exception抛出 an ,while则离开循环并catch执行块。

于 2013-02-19T09:03:30.377 回答
1

Thread.sleep()投掷前会清除“中断状态” InterruptedException。你需要在catch块中调用,否则while条件很可能不会成功,因为线程在返回Thread.currentThread().interrupt()时总是“不被中断” 。callMethod

异常不是由interrupt()方法引起的,而是由于sleep()阻塞了已发出“已中断”信号的线程。此处将对此进行更详细的说明。另请参阅此答案

于 2013-02-19T09:29:55.240 回答
1

在线程上调用中断本身不会引发异常。设置中断标志时休眠或等待是引发 InterruptedException 的原因。

什么会抛出 InterruptedException 是完全可以预见的,因此被中断的线程可以控制并且可以选择如何响应。这是一个检查异常,所以很明显是什么引发了它。它不像 ThreadDeath,它可以扔到任何地方。

当抛出 InterruptedException 时,线程的中断状态被重置。如果您想恢复线程的中断状态,因为您想稍后检查标志并使其为真,请调用Thread.currentThread().interrupt()以设置它。

在中断期间不会发生任何异常情况来改变指令的处理方式。因此,如果您选择在循环中捕获 InterruptedException 并检查标志以退出,则需要重置标志:

while(!Thread.currentThread().isInterrupted()){  
   //do something   
   try{  
     Thread.sleep(5000);    
   } catch(InterruptedException e){  
        Thread.currentThread().interrupt();
   }
}

或者,您可以使用 InterruptedException 退出循环:

try {
    while (!Thread.currentThread().isInterrupted()) {
        // do something
        Thread.sleep(5000);
    }
} catch (InterruptedException e) {
    // flag value is not used here, but still good style
    Thread.currentThread().interrupt(); 
}

如果这最后一个片段是被中断线程的整个运行方法,则无需再次设置中断状态即可过关,但如果您有其他部分正在使用的组件,您不希望一个行为不良的部分压制被中断的部分标记以便线程中的其他代码不知道中断。

于 2015-08-24T21:30:15.997 回答