首先,我阅读了有关此物品的其他问题,并且知道如何使用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;
}
请让我知道这是否是处理这种情况的正确方法,否则请问该怎么办?
谢谢。
答案 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;
}
简单地清除并忽略中断并不是完全不合理的态度。