ScheduledExecutorService:如何捕获它的异常?

ScheduledExecutorService: How do I catch its exceptions?

我目前正在使用 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 个 运行 上抛出此异常时,我如何 or/and 在何处捕获该异常?我真的必须为此搞乱覆盖吗?

您可以使用此构造函数注入您自己的 RejectedExecutionHandler 实现:

public ScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler)

所以你会不使用 executor = Executors.newScheduledThreadPool(1); 写:

executor = new ScheduledThreadPoolExecutor(1, new MyRejectedHandler());

其中 MyRejectedHandler 将是接口 RejectedExecutionHandler.

实现的一个实例

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

还有预定义的"policies":

你可以这样设置它们:

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

Do I really have to mess with overriding for that?

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

其他例外情况

如果您想捕获 run 方法内部出现的异常,那么我建议您将它的主体包含在 try/catch 中。这对于第一次拍摄来说是可以的。我倾向于将 try/catch 块缩小到真正需要的地方。这使您能够在池的执行线程上处理它们。