34

私は次の問題を抱えています、そして私は正確に何が起こるか知りたいです。私はJavaのScheduledExecutorServiceを使用して、5分ごとにタスクを実行しています。それは非常にうまく機能します。エグゼキュータは、Javaでのスレッドプログラミングの方法を完全に変えました。

ここで、Java Docを参照して、スケジュールされたタスクが未処理の例外で失敗した場合の動作について説明しましたが、何も見つかりませんでした。

次のスケジュールされたタスクはまだ実行されますか?未処理の例外がある場合、スケジュールされたエグゼキュータはタスクのスケジュールを停止しますか?誰かがこの単純な問題に関する情報を指摘できますか?

どうもありがとう。

4

4 に答える 4

34

両方のJavadocは、「タスクの実行で例外が発生した場合、それ以降の実行は抑制されます」scheduleAtFixedRateと述べています。scheduleWithFixedDelayそれが正確に明確であるとは思いませんが、runメソッドが何らかの例外をスローした場合、スケジューラーはそのタスクを効果的にドロップすると言っているようです。そのスケジューラを介して実行されている他のタスクは影響を受けません。それが実際に何をするかをテストするのは難しいことではありません...

タスクのキャンセルは必ずしも悪いことではないかもしれません。runメソッドがをスローする場合は、RuntimeExceptionおそらくどこかにバグがあり、システムの状態は不明です。ただし、少なくともRuntimeException、runメソッドをキャッチし、SEVEREで完全なスタックトレースをログに記録することをお勧めします。状況に応じて、タスクをキャンセルするために再スローすることをお勧めします。しかし、どちらの方法でも、何が悪かったのかを解明するための戦いのチャンスを得るには、ロギングが必要になります。

于 2009-11-02T12:11:40.493 に答える
13

scheduleAtFixedRate()またはを使用scheduleAtFixedDelay()していて、例外を除いてタスクが終了した場合、そのタスクは再スケジュールされません。ただし、他の独立したタスクは引き続き期待どおりに実行される必要があります。(APIドキュメントを参照してください)。これが発生したことに気付いた場合は、返されたを取得してメソッドScheduledFutureを呼び出すことができます。get()基になるタスクが例外をスローすると、get()メソッドからスローされ、。でラップされますExecutionException

于 2009-11-02T12:13:31.910 に答える
3

この男も同じ問題を抱えていました。

http://code.nomad-labs.com/2011/12/09/mother-fk-the-scheduledexecutorservice/

彼の解決策は、ランナブルの内部をキャッチして、 :Exceptionを再スローすることです。RuntimeException

try {
       theRunnable.run();
    } catch (Exception e) {
       // LOG IT HERE!!!
       System.err.println("error in executing: " + theRunnable + ". It will no longer be run!");
       e.printStackTrace();

       // and re throw it so that the Executor also gets this error so that it can do what it would
       // usually do
       throw new RuntimeException(e);
}
于 2014-03-05T10:41:00.143 に答える
-2

APIは特定の例外処理メカニズムを定義していないようです。つまり、キャッチされなかった例外はスレッドフレームをポップし、最終的にstderrに記録されます。

次の例外処理戦略を利用できるようです。

于 2009-11-02T12:14:00.443 に答える