如何在不中断业务逻辑的情况下处理 Java InterruptedException?

How to handle Java InterruptedException without business logic break?

首先我阅读了关于这个项目的其他问题并且知道如何使用 Thread.currentThread().interrupt();

但问题是,即使发生此异常,我也需要完成我的业务逻辑。 据我了解 "InterruptedException" 是 OS 要求我的线程停止执行一段时间的情况,这段时间之后线程可以继续执行。 我使用 semaphore.acquire(),如果发生 "InterruptedException" 异常,我想重试 "acquire" 操作。 我的代码如下所示:

  private final Semaphore semaphore = new Semaphore(1);
  ...

  private StorageConnection allocateConnection() {
        boolean allocated = false;
        while( !allocated ){
            try {
                semaphore.acquire();
                allocated = true;
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

        StorageConnection connection = connectionQueue.poll();
        // OTHER LOGIC
        return connection;
    }

请告诉我这是否是处理这种情况的正确方法,如果不是,我该怎么办?

提前致谢。

中断将来自您程序中的其他地方。 OS 不会自愿这样做。

通常中断表示代码应该离开那里。这可以通过抛出更合适的异常来处理。

目前你的代码,一旦被打断,就会不断地打断自己。这可以通过将中断状态保存在本地标志中来解决。

private StorageConnection allocateConnection() {
    boolean interrupted = false;
    boolean allocated = false;
    while( !allocated ){
        try {
            semaphore.acquire();
            allocated = true;
        } catch (InterruptedException e) {
            interrupted = true;
        }
    }

    StorageConnection connection = connectionQueue.poll();
    // OTHER LOGIC

    if (interrupted) {
        Thread.currentThread().interrupt();
    }

    return connection;
}

简单的清除和忽略中断并不是完全没有道理的态度。