Java计划执行程序的未处理异常

时间:2009-11-02 11:48:52

标签: java exception-handling multithreading executor

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

现在,我浏览了Java Doc,了解有关在计划任务因未处理的异常而失败但无法找到任何内容时会发生什么行为的信息。

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

非常感谢。

4 个答案:

答案 0 :(得分:29)

scheduleAtFixedRatescheduleWithFixedDelay的Javadoc说“如果任务的任何执行遇到异常,后续的执行都会被抑制。”我没有发现它完全清晰,但似乎是说如果你的run方法抛出任何类型的异常,那么调度程序将有效地删除该任务。通过该调度程序运行的任何其他任务都不应受到影响。不应该很难测试它实际上做了什么...

取消任务可能不一定是件坏事。如果run方法抛出RuntimeException,它可能在某个地方出现了错误,并且系统状态未知。但至少我建议在run方法中捕获RuntimeException,并在SEVERE上记录完整的堆栈跟踪。您可能希望根据具体情况重新抛出取消任务。但无论哪种方式,你都需要记录,以便有机会解决出错的问题。

答案 1 :(得分:12)

如果您使用scheduleAtFixedRate()scheduleAtFixedDelay(),并且您的任务因异常而失效,则该任务将不会重新安排。但是,其他独立任务应继续按预期执行。 (见API Docs)。如果您关心这种情况发生了,您可以抓住返回的ScheduledFuture并调用get()方法。如果基础任务抛出一个异常,你将把它从get()方法中抛出,包裹在ExecutionException中。

答案 2 :(得分:3)

这个男人有同样的问题。

http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/

他的解决方案是在runnable中捕获Exception并重新抛出RuntimeException

try {
       theRunnable.run();
    } catch (Exception e) {
       // LOG IT HERE!!!
       System.err.println("error in executing: " + theRunnable + ". It will no longer be run!");
       e.printStackTrace();

       // and re throw it so that the Executor also gets this error so that it can do what it would
       // usually do
       throw new RuntimeException(e);
}

答案 3 :(得分:-2)

看起来API没有定义任何特定的异常处理机制。即未捕获的异常只是弹出线程框架并最终被记录到stderr。

我看到您可以利用以下异常处理策略: