繁体   English   中英

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次执行任务时抛出此异常,我将如何捕获此异常? 我是否真的不得不为此压倒一切?

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

public Sc​​heduledThreadPoolExecutor(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM