在Java中防止在运行时异常时退出循环
我有一个服务,我希望它具有以下行为:在Java中防止在运行时异常时退出循环,java,exception,design-patterns,Java,Exception,Design Patterns,我有一个服务,我希望它具有以下行为: 如果服务接收到中断异常,或者JVM关闭,它应该尝试正常停止 如果发生“灾难性”事件,服务应该退出 应记录任何其他异常,状态应重置,循环应保持运行 循环在任何其他情况下都不应退出 这是我提出的一个过于简化的版本 在班级层面: private static volatile boolean keepRunning = true; static { Runtime.getRuntime().addShutdownHook(new Thread() {
private static volatile boolean keepRunning = true;
static {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
keepRunning = false;
}
});
}
然后循环:
while(keepRunning) {
try {
// Do something useful
Thread.sleep(10000); // just an example of something that can cause InterruptedException
}
catch(InterruptedException e) {
keepRunning = false;
}
catch(Exception e) { // catches all exceptions, but not any errors
// log it
// reset state
}
}
if(!keepRunning) {
// shut down gracefully
}
它似乎满足所有4个条件,但存在一些问题和不清楚的部分:
异常
而什么都不做是违反所有良好做法的。但在这种情况下,这是可以接受的,还是有更好的解决方案李>
错误
是否不满足条件2所需的全部操作?或者还有其他我应该注意的情况吗finally
部分,我不太喜欢在循环之后检查它(if(!keepRunning)
)。但在这种情况下,它似乎不适合最终。有更好的方法吗
我希望能直接回答我的问题,或者能指出不同的模式/解决方案。提前感谢。在您的情况下捕获
异常是可以的
如果您运行测试,不捕获错误是一个很好的做法
finally
块是您应该用来优雅地关闭的,是的,finally
块中的if
语句是必需的,并且通常是ok的
如果发生错误,您的finally
块仍将执行,因此一切正常
这段代码对Java 7和Java 8都适用只有在杀死所有现有用户线程后才会调用关闭挂钩。