我正在使用ThreadPoolExecutor,其中包含一些消息,这些消息提供线程将消息馈送到其中进行处理。每个线程在提交之前都会检查执行器的深度。如果深度超过一定阈值,则线程将等待一定时间,然后再次检查。仅当发现深度低于阈值时才会提交。因此,我认为执行程序不会从太多消息中爆炸。但是,我仍然想知道我需要寻找哪些异常。我只从api的“ RejectedExecutionException”中发现了它,它可以来自执行器:
当执行器已关闭时,并且在执行器对最大线程和工作队列容量使用有限范围且已饱和时,将拒绝在方法execute(java.lang.Runnable)中提交的新任务。
RejectedExecutionException是我需要在日志中查找的唯一异常吗?有没有人遇到执行者陷入困境的情况?在那种情况下会发生什么?我们还会看到RejectedExecutionException吗?还有其他可能的例外吗?非常感谢!
根据经验,我发现与使用Executors时相比,您需要具有一个提供根Exception类的辅助功能,以便可以正确地将其记录下来以进行诊断。发生这种情况是因为有些执行程序抛出java.util.concurrent.TimeoutException,有些则抛出java.util.concurrent.ExecutionException,具体取决于实现方式,所以我想出了以下接口
UnaryOperator<Throwable> flatEx = t ->
t.getCause() == null ? t :
t.getCause().getCause() == null ? t.getCause() :
t.getCause().getCause().getCause() == null ? t.getCause().getCause() :
t.getCause().getCause().getCause();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句