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

时间:2019-12-11 17:29:24

标签: java semaphore interrupted-exception

首先,我阅读了有关此物品的其他问题,并且知道如何使用Thread.currentThread().interrupt();

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

  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;
    }

请让我知道这是否是处理这种情况的正确方法,否则请问该怎么办?

谢谢。

1 个答案:

答案 0 :(得分:1)

该中断将来自程序中的其他位置。这并不是操作系统要自行解决的问题。

通常情况下,中断表明代码应该离开那里。这可以通过引发更适当的异常来解决。

当前,您的代码一旦被中断,将继续中断自身。通过将中断状态保留在本地标志中可以解决此问题。

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;
}

简单地清除并忽略中断并不是完全不合理的态度。