ScheduledExecutorService:如何捕获其异常?

时间:2016-06-15 07:56:57

标签: java java.util.concurrent scheduledexecutorservice

我目前正在使用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 个答案:

答案 0 :(得分: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,它在拥塞时从队列中删除了可选的低prio任务。

其他例外情况

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