-4

好的,在我的一个课程中,我想抛出一个 InterruptedException。我通过调用来做到这一点

thread.interrupt();

据我所知,这将引发 InterruptedException。我想知道的是如何在我的线程中捕获这个异常。这显然行不通:

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

编辑:如果我在我的线程中使用 try/catch 块,如果我从不声明它被抛出,我怎么能捕捉到一个中断的异常?

4

2 回答 2

4

调用thread.interrupt不会自动抛出InterruptedException. 您需要定期检查中断状态。例如:

if(Thread.currentThread().isInterrupted()) {
    throw new InterruptedException(); // or handle here.
}

有些方法会为您执行此操作,例如Thread.sleep,否则不会抛出异常。

于 2013-01-28T23:31:06.150 回答
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()它),它将停止。随意提出一个更复杂的例子。

于 2013-01-28T23:19:41.263 回答