我目前正在使用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次执行任务时抛出此异常,我将如何捕获此异常?我是否真的不得不为此而压倒一切?
答案 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块缩小到真正需要它们的位置。这使您可以在池的执行线程上处理它们。