我遇到了问题。我有一些看起来像这样的代码:
executor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("Exec"));
[...]
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// my task
...
}, 1, 1, TimeUnit.MINUTES);
每隔一段时间,所述任务就会遇到问题并崩溃。 newSingleThreadScheduledExecutor有一个有趣的属性:它会以静默方式死掉,不再执行任务。
我需要修改这种行为。换句话说,即使run()遇到RuntimeException,我希望任务继续以固定速率执行。
我该怎么做?
答案 0 :(得分:2)
我需要修改这种行为。换句话说,即使run()遇到RuntimeException,我希望任务继续以固定速率执行。
最简单的方法是创建一个包装器Runnable
:
public final class ExceptionSwallowingRunnable implements Runnable {
private final Runnable delegate;
public ExceptionSwallowingRunnable(Runnable delegate) {
// TODO: Argument validation
this.delegate = delegate;
}
@Override public void run() {
try {
delegate.run();
} catch (RuntimeException e) {
// Logging etc
}
}
}
然后在预定的执行程序中运行 ,包装您的真实任务。请注意,如果确实希望抓住所有内容,您可能会抓住Throwable
,但我不建议这样做。
可能有另一种方法,但这是我能想到的最简单的方法,没有进一步的研究:)