好的,在我的一个类中,我想抛出一个InterruptedException。我通过致电
来做到这一点thread.interrupt();
据我所知,这将抛出InterruptedException。我想知道的是如何在我的线程中捕获此异常。这显然不起作用:
public void run() throws InterruptedException // This results in an error
编辑:如果我在我的线程中使用try / catch块,如果我从未声明它被抛出,我如何捕获interrupttedexception?
答案 0 :(得分:4)
调用thread.interrupt
不会自动抛出InterruptedException
。您需要定期检查中断状态。例如:
if(Thread.currentThread().isInterrupted()) {
throw new InterruptedException(); // or handle here.
}
有些方法会为您执行此操作,例如Thread.sleep
,但不会抛出任何异常。
答案 1 :(得分:3)
要回答你的直接问题,你会像任何其他异常一样抓住它。通常,这将在响应睡眠命令时完成,该命令会抛出异常。如果你抓住它,就没有必要将它抛出run语句。这应该有用,例如:
void run()
{
try
{
Thread.sleep(500);
}
catch (InterruptedException ex)
{
//Do stuff here
}
}
但是,我怀疑InterruptedException可能并不代表你的想法。它仅在Thread.sleep()等方法中抛出,与thread.interrupt()
无关,尽管名称相似。如果你想测试来自不同线程的thread.interrupt(),你需要做这样的事情:
public void run()
{
while (true)
{
if (Thread.interrupted()) // Clears interrupted status!
{
//Stop
break;
}
}
}
给定的代码将永远运行一个线程,直到它被中断(由另一个调用interrupt()
的线程),它将停止。随意提出一个更复杂的例子。