[英]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次执行任务时抛出此异常,我将如何捕获此异常? 我是否真的不得不为此压倒一切?
您可以使用此构造函数注入您自己的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块缩小到真正需要它们的位置。 这使您可以在池的执行线程上处理它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.