使用 Java 调度执行程序的未处理的异常

我有以下问题,我想知道到底发生了什么。我正在使用Java的SchpectedExecutorService每五分钟运行一次任务。它工作得很好。执行器完全改变了我在Java中进行线程编程的方式。

现在,我浏览了Java Doc,以获取有关如果计划任务因未处理的异常而失败但找不到任何内容时的行为的信息。

下一个计划任务是否仍将运行?如果存在未处理的异常,调度执行器会停止调度任务吗?任何人都可以指出有关这个简单问题的信息吗?

多谢。


答案 1

两者的 Javadoc 都说:“如果任务的任何执行遇到异常,后续执行将被抑制。我不认为这很清楚,但它似乎是在说,如果你的方法抛出任何类型的异常,那么调度程序将有效地放弃该任务。通过该计划程序运行的任何其他任务不应受到影响。测试它的实际作用应该不难...scheduleAtFixedRatescheduleWithFixedDelayrun

取消任务可能不一定是一件坏事。如果 run 方法抛出 一个 ,则可能是在某个地方有 bug,并且系统的状态是未知的。但至少我建议在你的运行方法中捕获,并在SEVERE上记录完整的堆栈跟踪。然后,您可能希望重新抛出以取消任务,具体取决于具体情况。但无论哪种方式,您都需要日志记录才能有机会找出问题所在。RuntimeExceptionRuntimeException


答案 2

如果您使用的是 或 ,并且您的任务在出现异常的情况下被救助,则不会重新安排该任务。但是,其他独立任务应继续按预期执行。(请参阅 API 文档)。如果您关心这种情况已经发生,则可以抓住返回的并调用该方法。如果基础任务抛出异常,则会将其从方法中抛出,并包装在 .scheduleAtFixedRate()scheduleAtFixedDelay()ScheduledFutureget()get()ExecutionException


推荐