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

Pab*_*ruz 30 java multithreading exception-handling executor

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

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

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

非常感谢.

Lac*_*lan 29

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

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

  • 快速浏览ThreadPoolExecutor的源代码(实现STPE的atop)表明RuntimeExceptions将被整齐地捕获并通过ScheduledFuture报告,但它们也将导致工作线程终止.如有必要,TPE将注意到此工作线程终止并启动新的替换.请参阅JDK源代码中的java.util.concurrent.ThreadPoolExecutor中的runWorker()和processWorkerExit(),或者访问Doug Lea的站点. (5认同)

and*_*soj 12

如果您正在使用scheduleAtFixedRate()scheduleAtFixedDelay(),并且您的任务因异常而失效,则该任务将不会重新安排.但是,其他独立任务应继续按预期执行.(请参阅API文档).如果您关心这种情况发生了,您可以抓住ScheduledFuture返回的那个并调用该get()方法.如果底层任务抛出异常,你将把它抛出get()方法,包装在一个ExecutionException.