我有一项服务,并且我希望它具有以下行为:
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
}
似乎满足所有四个条件,但是存在一些问题和不清楚的部分:
Exception
和不执行任何操作均违反所有良好做法。但是在这种情况下是可以接受的,还是有更好的解决方案?Error
我为满足条件#2所需要做的一切?还是我应该注意其他情况?finally
异常关闭”代码在异常之后进入该节,而我真的不喜欢在循环(if(!keepRunning)
)之后检查它。但是finally
在这种情况下似乎不合适。有更好的方法吗?我将很乐意直接回答我的问题,或获得指向不同模式/解决方案的指导。提前致谢。
可以根据Exception
您的情况进行检查。
Error
如果您运行测试,则不捕获是一种好习惯。
该finally
块是您用来正常关闭的工具,是的-if
该finally
块中的语句是必需的,通常情况下还可以。
如果发生错误,您的finally
块仍将执行,因此一切正常。
Java 7和Java 8都可以使用此代码
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句