如果我自己不打断任何事情,我是否必须担心中断异常?

2022-09-01 06:54:52

我正在一个爱好项目中使用。它用于我正在编写的连接池类。我可以毫不费力地使用它,除了这种方法:java.util.concurrent.Semaphore

public void acquire(int permits) throws InterruptedException

这迫使我处理.现在,我不确定“中断”线程是什么意思,而且我从未在我的代码中这样做(好吧,无论如何都不是显式的)。这是否意味着我可以忽略异常?我应该如何处理?InterruptedException


答案 1

是的,您需要担心 ,就像您需要担心必须抛出或处理的任何其他已检查异常一样。InterruptedException

大多数情况下,一个信号是停止请求,很可能是因为运行代码的线程被中断了InterruptedException

在连接池等待获取连接的特定情况下,我会说这是一个取消问题,您需要中止获取,清理和还原中断的标志(见下文)。


举个例子,如果你在里面使用某种/运行,那么你需要正确处理中断的异常:RunnableCallableExecutor

executor.execute(new Runnable() {

    public void run() {
         while (true) {
              try {
                 Thread.sleep(1000);
              } catch ( InterruptedException e) {
                  continue; //blah
              }
              pingRemoteServer();
         }
    }
});

这意味着您的任务永远不会遵守执行程序使用的中断机制,并且不允许适当的取消/关闭。

相反,正确的成语是恢复中断状态,然后停止执行:

executor.execute(new Runnable() {

    public void run() {
         while (true) {
              try {
                 Thread.sleep(1000);
              } catch ( InterruptedException e) {
                  Thread.currentThread().interrupt(); // restore interrupted status
                  break;
              }
              pingRemoteServer();
         }
    }
});

有用的资源


答案 2

不。 仅在您自己中断线程时生成。如果您自己不使用,那么我要么将其作为某种“意外异常”重新抛出,要么将其记录为错误并继续前进。例如,在我的代码中,当我被迫捕获并且我从不称自己为时,我做的相当于InterruptedExceptionThread.interrupt()InterruptedExceptioninterrupt()

catch (InterruptedException exception) {
    throw new RuntimeException("Unexpected interrupt", exception);
}

那是如果它是意想不到的。有很多地方我故意打断我的线程,在这些情况下,我以明确定义的方式处理s。通常,这是通过退出我所在的任何循环,清理,然后停止线程。InterruptedException


推荐