1 回答
TA贡献1805条经验 获得超10个赞
我遇到了一些异常,进一步执行停止。
ScheduledExecutorService.scheduleAtFixRate()
这是根据规范的预期行为:
如果任务的任何执行遇到异常,则后续执行将被抑制。
关于您的需求:
我想捕获系统关闭我的应用程序的异常。
我应该使用第三个线程来处理异常,该线程同时监视未来并处理异常,还是有其他更好的方法?
处理未来的回报看起来ScheduledFuture.get()
是正确的。根据ScheduledFuture.scheduleAtFixedRate()
规格:
否则,任务只会通过取消或终止执行者来终止。
所以你甚至不需要创建一个新的预定未来。
只需运行两个并行任务(ExecutorService
也可以使用一个或两个线程),等待get()
每个任务Future
并在任务中抛出异常时停止应用程序:
Future<?> futureA = ses1.scheduleAtFixRate(..) // for thread 1
Future<?> futureB = ses2.scheduleAtFixRate(..) // for thread 2
submitAndStopTheApplicationIfFail(futureA);
submitAndStopTheApplicationIfFail(futureB);
public void submitAndStopTheApplicationIfFail(Future<?> future){
executor.submit(() -> {
try {
future.get();
} catch (InterruptedException e) {
// stop the application
} catch (ExecutionException e) {
// stop the application
}
});
}
添加回答
举报