ScheduledExecutorService:如何捕获它的异常?

4
我目前正在使用一个ScheduledExecutorService。我是这样使用它的:
ScheduledExecutorService executor;
public class ScheduledFanSpeedController implements Runnable {
.
.
.
public void start(){
executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(this, 0, 55, TimeUnit.SECONDS);
}

.scheduleAtFixRate 可能会抛出 RejectedExecutionException 异常。当执行器在第 n 次运行任务时抛出此异常,我该如何在何处捕获它?我真的需要覆盖方法来处理吗?

1个回答

5
您可以使用此构造函数注入自己的RejectedExecutionHandler实现: public ScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler) 因此,您可以使用以下代码替代executor = Executors.newScheduledThreadPool(1);
executor = new ScheduledThreadPoolExecutor(1, new MyRejectedHandler());

这里的MyRejectedHandler应该是您实现RejectedExecutionHandler接口的实例。

我曾经使用过这个来处理拥塞。

还有预定义的“策略”:

您可以像这样设置它们:

executor = new ScheduledThreadPoolExecutor(1, new ThreadPoolExecutor.DiscardOldestPolicy());

我真的需要覆盖它吗?

不确定你的意思。但是,如果你认为你必须扩展ThreadPoolExecutor,则在大多数情况下:不需要。这个类系列在我看来设计得非常好,非常完整,你几乎永远不会有这样的冲动。它几乎就像一个建筑工具包,允许各种各样的行为。我曾经做过的最侵入性的实现是注入自己的ThreadFactory(用于线程命名)和一个RejectedExecutionHandler,在拥塞时从队列中删除可选的低优先级任务。

其他异常

如果您想捕获run方法内部引发的异常,则建议将其主体放在try/catch中。这对初学者来说是可以的。我倾向于缩小try/catch块到它们真正需要的地方。这使您能够在池的执行线程上处理它们。


谢谢,我不知道这个可能性。这正是我在寻找的。 - Herr Derb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接