如何在不中断业务逻辑的情况下处理 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;
}
简单的清除和忽略中断并不是完全没有道理的态度。
首先我阅读了关于这个项目的其他问题并且知道如何使用 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;
}
简单的清除和忽略中断并不是完全没有道理的态度。