newSingleThreadscheduledExecutor

时间:2012-09-29 18:52:06

标签: java multithreading concurrency

我遇到了问题。我有一些看起来像这样的代码:

executor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("Exec"));
[...]
executor.scheduleAtFixedRate(new Runnable() {

@Override
public void run() {
// my task
...
}, 1, 1, TimeUnit.MINUTES);

每隔一段时间,所述任务就会遇到问题并崩溃。 newSingleThreadScheduledExecutor有一个有趣的属性:它会以静默方式死掉,不再执行任务。

我需要修改这种行为。换句话说,即使run()遇到RuntimeException,我希望任务继续以固定速率执行。

我该怎么做?

1 个答案:

答案 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,但我不建议这样做。

可能有另一种方法,但这是我能想到的最简单的方法,没有进一步的研究:)