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 に答える