今天遇到ScheduledThreadPoolExecutor任务调度线程池的一个大坑, 那就是如果启动的延迟执行线程(包括定频率或定延迟)里面有运行时异常抛出没有自己catch捕获时你会发现运行没有反应但是又没有报错的情况, 下面我写一个简单的例子大家就明白了.
运行如下图:
当过了1秒线程执行之后:
大家会发现控制台什么都没有, 我明明有抛异常啊.
如果我们自己手动显示的捕获异常呢:
运行如下:
大家会发现控制台打印异常了.
结论: 建议大家写任务调度线程池的线程代码时使用异常最高父类Throwable进行捕获, 将整段代码包含在内以免出现问题又不显示而头大的问题.
大家可能会奇怪这里为什么要用Throwable, 用Exception不行么, 因为Throwable下面有两个子类: Exception和Error,
使用Throwable即便是Error异常都可以捕获.