ScheduledExecutorServiceの使い方

schedule()、scheduleAtFixedRate()、scheduleWithFixedDelay()の違いをおさえよう。

執筆時バージョン
Java

Java SE 8

概要

ExecutorServiceを拡張したインタフェースで、定期実行が可能なメソッドを提供する。ExecutorServiceではsubmit()された処理を即時実行するので、タイミングの遅延実行や定期実行処理をしたい場合にこれらのメソッドを利用する。

Executorフレームワーククラス図

ExecutorServiceと同様、ファクトリが提供されているのでそちらからインスタンスを生成するのが基本。

schedule()、scheduleAtFixedRate()、scheduleWithFixedDelay()の違い

ScheduledExecutorServiceは3つのメソッドが用意されているが違いは次のようになる。

単発実行

  • schedule()

    • delay後に1回のみcommnadを実行する

定期実行

  • scheduleAtFixedRate()

    • ScheduledExecutorServiceが終了されるまで定期的に実行される

    • initialDelay後に1回目を実行。そのあとはdelay後ごとに2回目、3回目が実行される。

    • よって、開始タイミングが一定。

    • ただしdelayよりもcommandの処理時間がかかった場合、commandの実行終了を待って実行される。前回のスケジュールが終わっていない段階では実行されない(並行実行しない)。

  • scheduleWithFixedDelay()

    • ScheduledExecutorServiceが終了されるまで定期的に実行される

    • initialDelay後に1回目を実行。そのあとはcommandの実行時間 + delay後ごとに2回目、3回目が実行される。

      • scheduleAtFixedRate()との違いはcommandの実行時間を含めるか否か

    • よって、前回終了から次回実行までの期間が一定。

実行開始タイミングを図にすると次のようなイメージ。

ScheduledExecutorServiceの実行タイミング比較

Appendix B: 改訂履歴

  • v1.0, 2017-04-10: 初稿