我是线程概念的新手。我试图在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”同时被抛出..
我期待中断在没有第二次打印的情况下抛出“睡眠中断”。
谢谢!
答案 0 :(得分:4)
阅读interrupt()
的javadoc:
如果此线程被阻止[...]
如果此线程被阻止[...]
如果此线程被阻止[...]
如果以前的条件都不成立,那么此线程的中断状态将被设置。
由于您在调用interrupt()
时未阻止您的主题,因此它只会设置状态,而不会抛出异常。
sleep()
方法然后检测中断状态并抛出异常。
答案 1 :(得分:0)
你想要的是
UIViewController
答案 2 :(得分:0)
当你调用Thread.currentThread()。interrupt()时,你设置线程的中断标志,然后适当地由更高级别的中断处理程序使用。通常,当人们捕获InterruptedException(即,在catch块内)以让调用者知道发生了中断时,人们会使用它。
但是在这里,你用它来退出for循环。当你第二次进入Thread.Sleep()时,程序会实现标志设置。要手动阅读,
试试这个
for(int i = 0; i <= 5 && !Thread.currentThread().isInterrupted(); i++){
答案 3 :(得分:0)
原因是你在调用interrupt()
时实际上并没有打断你的线程。
因此,当中断状态设置为中断后,您的第二触发异常。在这种状态下,你不能睡觉,所以你得到了例外。