Java:即使在当前线程中断后,for循环也会执行一次

时间:2016-05-27 21:58:48

标签: java multithreading interrupt

我是线程概念的新手。我试图在run()中断当前线程。

基本上,我试图打印出一个单词5次(在for循环中),其间有2s睡眠。当我在第二次执行循环之前尝试中断线程时,我仍然会在第二次打印出单词。

public void run()
{
try{
for(int i=0;i<=5;i++){
 //print word
 System.out.println(word);
 //sleep
  Thread.sleep(2000);
 //interrupt
  Thread.currentThread().interrupt();

 }
 } catch(InterruptedException e){
 System.out.println("sleep interrupted");
 }
}

但是,当我编译并运行代码时,我得到以下结果:

word
word
sleep interrupted

我期待在循环到for循环的下一个实例之前调用中断时只打印一次该单词。我不明白为什么第二个单词和InterruptedException“sleep interrupted”同时被抛出..

我期待中断在没有第二次打印的情况下抛出“睡眠中断”。

谢谢!

4 个答案:

答案 0 :(得分:4)

阅读interrupt()的javadoc:

  

如果此线程被阻止[...]

     

如果此线程被阻止[...]

     

如果此线程被阻止[...]

     

如果以前的条件都不成立,那么此线程的中断状态将被设置

由于您在调用interrupt()时未阻止您的主题,因此它只会设置状态,而不会抛出异常。

sleep()方法然后检测中断状态并抛出异常。

答案 1 :(得分:0)

  • 第一次打印字
  • 睡2秒
  • 中断()调用
  • 第二次打印字
  • 调用sleep抛出InterruptedException

你想要的是

UIViewController

答案 2 :(得分:0)

当你调用Thread.currentThread()。interrupt()时,你设置线程的中断标志,然后适当地由更高级别的中断处理程序使用。通常,当人们捕获InterruptedException(即,在catch块内)以让调用者知道发生了中断时,人们会使用它。

但是在这里,你用它来退出for循环。当你第二次进入Thread.Sleep()时,程序会实现标志设置。要手动阅读,

试试这个

for(int i = 0; i <= 5 && !Thread.currentThread().isInterrupted(); i++){

答案 3 :(得分:0)

原因是你在调用interrupt()时实际上并没有打断你的线程。

因此,当中断状态设置为中断后,您的第二触发异常。在这种状态下,你不能睡觉,所以你得到了例外。