我正在使用ThreadPoolExecutor,其中有几条消息提供线程将消息馈送到其中进行处理。每个线程在提交之前都会检查执行器的深度。如果深度超过特定阈值,则线程将等待一定时间,然后再次检查。仅当发现深度低于阈值时才会提交。因此,我认为执行程序不会从太多消息中爆炸。但是,我仍然想知道我需要寻找哪些异常。我仅从api的“ RejectedExecutionException”中发现了它,它可以来自执行器:
在执行器已关闭时,并且在执行器对最大线程和工作队列容量使用有限范围且已饱和时,将拒绝在方法execute(java.lang.Runnable)中提交的新任务。
RejectedExecutionException是我需要在日志中查找的唯一异常吗?有没有人遇到执行者陷入困境的情况?在那种情况下会发生什么?我们还会看到RejectedExecutionException吗?还有其他可能的例外吗?非常感谢!
答案 0 :(得分:0)
根据经验,我发现与使用Executor时相比,您需要具有一个辅助功能来提供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();