【问题标题】:How do I catch an InterruptedException in a thread in Java? [closed]如何在 Java 的线程中捕获 InterruptedException? [关闭]
【发布时间】:2013-01-12 10:35:48
【问题描述】:

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

thread.interrupt();

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

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

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

【问题讨论】:

  • 你熟悉try/catch语句吗?
  • 用 try and catch 包围
  • 是的,我是。但是,我应该如何捕获从未声明为抛出的异常?
  • try { code } catch (RuntimeException ex) { do something with ex } 或者甚至只是try { code } catch (Throwable t) { do something with t },如果你想真正去做的话。只要确保你在抓到ext 后对其进行处理;如果需要,至少 ex.printStackTrace()t.printStackTrace();不过,InterruptedException 预计会被抛出并用作指标。阅读线程。
  • @user1420042 你可以通过链接异常再次抛出异常,但是你的方法需要声明'throws InteruptedException'并且你需要在某个时候处理异常。

标签: java multithreading exception


【解决方案1】:

要回答您的直接问题,您可以像任何其他异常一样捕获它。通常,这将响应睡眠命令而完成,该命令确实会引发异常。如果你抓住了它,就没有必要把它扔到 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()),它将停止。随意想出一个更复杂的例子。

【讨论】:

  • InterruptedException 不是 RuntimeException。如果它被抛出,你总是必须抓住它。
  • 它也不是“被外螺纹抛出”。线程被中断,导致某些方法抛出InterruptedException
  • 而且它不仅仅是在sleep() 语句中抛出。 Object.wait() 可以抛出它以及一些 NIO 方法。叹息。
  • @PearsonArtPhoto 继续。 thread.interrupt 通常会中断一些其他线程而不是正在运行的线程。
  • 好吧,我想我已经玩完了这个。我把它留给大家来确定它是否值得。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 2011-07-27
    • 2012-12-22
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2014-07-15
    相关资源
    最近更新 更多