如何在Java中的线程中捕获InterruptedException?

时间:2013-01-28 23:17:02

标签: java multithreading exception

好的,在我的一个类中,我想抛出一个InterruptedException。我通过致电

来做到这一点
thread.interrupt();

据我所知,这将抛出InterruptedException。我想知道的是如何在我的线程中捕获此异常。这显然不起作用:

public void run() throws InterruptedException // This results in an error

编辑:如果我在我的线程中使用try / catch块,如果我从未声明它被抛出,我如何捕获interrupttedexception?

2 个答案:

答案 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()的线程),它将停止。随意提出一个更复杂的例子。