0

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

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

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

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

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

我怎么做?

4

1 回答 1

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,如果您真的想捕获所有内容,则可能会捕获 - 不过我不建议这样做。

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

于 2012-09-29T19:02:35.097 回答