多线程-当ScheduledExecutorService周期任务中抛异常之后的情况
2020年1月9日
18:56
先说结论:结论就是无论如何runnable中只要抛出异样并且没有被try catch包裹,该runnable以后的周期任务都会被取消,不会再周期执行。sheduleAtFixedRate中作业被取消!
如何知道是抛出的什么异常呢,使用thread.setUncaughtExceptionHandler()方法是不行的,因为他是在Thread被异常停止才会获取异常,而使用Executors线程不会被停止,所以无法用setUncaughtExceptionHandler()获取到异常信息。
那如何获取异常信息呢?使用ScheduleFuture类,如下:
注意,这段代码不是捕获异常!!一旦抛出异常,作业将被清除。这段代码只确保它不会悄无声息地发生,所以如果它发生了,您就知道它发生的时间和原因。让执行继续运行的惟一方法是用try/catch将所有内容包围起来。
参考:https://www.cosmocode.de/en/blog/schoenborn/2009-12/17-uncaught-exceptions-in-scheduled-tasks
https://stackoverflow.com/questions/6894595/scheduledexecutorservice-exception-handling