监视ThreadPoolExecutor抛出的运行时异常

时间:2019-05-08 07:16:53

标签: runtimeexception threadpoolexecutor

我正在使用ThreadPoolExecutor,其中有几条消息提供线程将消息馈送到其中进行处理。每个线程在提交之前都会检查执行器的深度。如果深度超过特定阈值,则线程将等待一定时间,然后再次检查。仅当发现深度低于阈值时才会提交。因此,我认为执行程序不会从太多消息中爆炸。但是,我仍然想知道我需要寻找哪些异常。我仅从api的“ RejectedExecutionException”中发现了它,它可以来自执行器:

  

在执行器已关闭时,并且在执行器对最大线程和工作队列容量使用有限范围且已饱和时,将拒绝在方法execute(java.lang.Runnable)中提交的新任务。

RejectedExecutionException是我需要在日志中查找的唯一异常吗?有没有人遇到执行者陷入困境的情况?在那种情况下会发生什么?我们还会看到RejectedExecutionException吗?还有其他可能的例外吗?非常感谢!

1 个答案:

答案 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();