【发布时间】:2016-05-27 21:58:48
【问题描述】:
我是线程概念的新手。我试图中断 run() 中的当前线程。
基本上,我试图打印一个单词 5 次(在 for 循环中),中间有 2 秒睡眠。当我尝试在第二次循环执行之前中断线程时,我仍然会在第二次打印出这个词。
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,然后它会检查标志并引发异常。 -
扩展@BoristheSpider 的评论:要获得所需的行为,您必须从外部源(另一个线程)中断线程。
-
@Turing85 从外部源中断仍然不会立即中断。如果线程当前正在执行
i++而另一个线程调用interrupt(),您仍然会看到相同的行为。 -
@Andreas 你是对的。确切地说,必须在第一次迭代中执行
sleep(...)之前或期间中断线程。这是一个我没有提到的沉默假设,但注意到它为时已晚,所以我无法编辑我的评论:) -
感谢大家向我解释!真的很感激..
标签: java multithreading interrupt