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":
- ThreadPoolExecutor.AbortPolicy(默认值)
- ThreadPoolExecutor.CallerRunsPolicy(在调用执行的线程上运行任务,当然会阻塞它)
- ThreadPoolExecutor.DiscardPolicy(丢弃被拒绝的任务)
- ThreadPoolExecutor.DiscardOldestPolicy(将被拒绝的任务添加到队列中并丢弃队列中最早的任务)
你可以这样设置它们:
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 块缩小到真正需要的地方。这使您能够在池的执行线程上处理它们。
我目前正在使用 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":
- ThreadPoolExecutor.AbortPolicy(默认值)
- ThreadPoolExecutor.CallerRunsPolicy(在调用执行的线程上运行任务,当然会阻塞它)
- ThreadPoolExecutor.DiscardPolicy(丢弃被拒绝的任务)
- ThreadPoolExecutor.DiscardOldestPolicy(将被拒绝的任务添加到队列中并丢弃队列中最早的任务)
你可以这样设置它们:
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 块缩小到真正需要的地方。这使您能够在池的执行线程上处理它们。