我有服务,我希望它有以下行为:
InterruptedException
,或者JVM关闭,它应该尝试优雅地停止所以这是我提出的过于简化的版本。
在课堂上:
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个条件,但存在一些问题和不清楚的部分:
Exception
而不做任何事情是违反所有良好做法的。但在这种情况下是否可以接受,或者有更好的解决方案? Error
我需要做些什么来满足条件#2?或者还有其他我应该注意的情况吗?finally
部分,我真的不喜欢我必须在循环后检查它(if(!keepRunning)
) 。但在这种情况下似乎不适合finally
。有没有更好的方法呢?我将非常感谢我对问题的直接回答,或对不同模式/解决方案的指示。提前谢谢。
答案 0 :(得分:2)
可以在你的案例中抓住Exception
。
如果你运行测试,不捕捉Error
是一个很好的做法。
finally
块是您应该用来优雅地关闭的块,是的 - if
块中的finally
语句是必需的,一般都可以。
如果发生错误,您的finally
块仍将执行,因此一切正常。
此代码适用于Java 7和Java 8