监视ThreadPoolExecutor抛出的运行时异常

Hua

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

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

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

加布里埃尔·埃尔南德斯(Gabriel Hernandez)

根据经验,我发现与使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章