を使用してタスクをスケジュールするコードがありますjava.util.Timer
。 いろいろ調べていたら、でもExecutorService
同じことができることがわかりました。 質問ですが、タスクをスケジュールするためにTimer
とを使用しましたか? どちらかExecutorService
一方を使用することで、もう一方を使用するよりもどのような利点がありますか?
Timer
また、誰かがこのクラスを使用して、何か問題に遭遇し、それを解決したかどうかも確認したいと思いましたExecutorService
。
ベストアンサー1
によるとJava の並行処理の実践:
Timer
システムクロックの変化に敏感になる可能性がある、ScheduledThreadPoolExecutor
そうではない。Timer
には実行スレッドが 1 つしかないため、長時間実行されるタスクは他のタスクを遅延させる可能性があります。 はScheduledThreadPoolExecutor
任意の数のスレッドで構成できます。さらに、必要に応じて、作成されたスレッドを完全に制御できます ( を提供することによりThreadFactory
)。- でスローされたランタイム例外により、
TimerTask
そのスレッドが 1 つ強制終了され、Timer
デッドになります :-( ... つまり、スケジュールされたタスクは実行されなくなります。ScheduledThreadExecutor
ランタイム例外をキャッチするだけでなく、必要に応じてそれらを処理することもできます (afterExecute
からメソッドをオーバーライドすることによりThreadPoolExecutor
)。例外をスローしたタスクはキャンセルされますが、他のタスクは引き続き実行されます。
ScheduledThreadExecutor
の代わりにを使用できる場合はTimer
、そうしてください。
もう1つ... ScheduledThreadExecutor
Java 1.4ライブラリでは利用できませんが、JSR 166 ( java.util.concurrent
) の Java 1.2、1.3、1.4 へのバックポート、ScheduledThreadExecutor
クラスを持っています。