Skip to content
閲覧中:
3. Scheduled Executor Service (31-40)

3. Scheduled Executor Service (31-40)

ScheduledExecutorServiceは、特定の時間遅延後、または定期 的にタスクを実行するための仕組みです。Java Gold試験では、特 に**「実行間隔の計算方法の違い」**が非常によく狙われます。

31番から40番まで、全項目をサンプルコードと共に解説します。


31. ScheduledExecutorServiceの生成

Executorsクラスのファクトリメソッドを使用して生成します。

Java
// スレッド数を指定して生成。内部的にタイマー用のスレッドを持つ
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);

32. schedule(Callable/Runnable, delay, unit)

タスクを**1回だけ**、指定した時間経過後に実行します。

Java
// 5秒後に実行
ScheduledFuture<String> future = scheduler.schedule(
    () -> "Task Finished", 
    5, 
    TimeUnit.SECONDS
);
// Futureを通して結果の取得やキャンセルが可能

33 & 35. scheduleAtFixedRate(固定レート実行)

タスクの**開始時間**を基準にして、一定の間隔で実行を繰り返します。

Java
// 第2引数: 初回実行までの遅延, 第3引数: 実行間隔
scheduler.scheduleAtFixedRate(
    () -> System.out.println("Start fixed rate"), 
    1, // 1秒後に初回実行
    3, // その後、3秒ごとに実行開始
    TimeUnit.SECONDS
);
sequenceDiagram
    participant Timer as スケジューラ
    participant Task as タスク実行

    Note over Timer, Task: period = 10秒, 処理時間 = 5秒 の場合

    Timer->>Task: 00:00 実行開始 (1回目)
    activate Task
    Task-->>Timer: 00:05 完了
    deactivate Task

    Note over Timer: 次回は 00:00 + 10秒 = 00:10

    Timer->>Task: 00:10 実行開始 (2回目)
    activate Task
    Task-->>Timer: 00:15 完了
    deactivate Task
sequenceDiagram
    participant CPU
    Note over CPU: Period = 5s, Delay = 0s
    CPU->>CPU: タスク1開始 (0s)
    activate CPU
    Note right of CPU: 実行時間: 2s
    CPU-->>CPU: タスク1終了 (2s)
    deactivate CPU
    Note over CPU: 待機: 3s
    CPU->>CPU: タスク2開始 (5s)
    activate CPU
    Note right of CPU: 実行時間: 2s
    CPU-->>CPU: タスク2終了 (7s)
    deactivate CPU
  • 35. 試験ポイント: もしタスクの処理時間が「実行間隔」 より長い場合、次のタスクは前のタスクが終わるのを待ってか ら即座に開始されます。並列には走りません。

34. scheduleWithFixedDelay(固定遅延実行)

前のタスクが**終了した時間**を基準にして、一定の待機時間を 置いて実行を繰り返します。

Java
scheduler.scheduleWithFixedDelay(
    () -> {
        System.out.println("Processing...");
        // 処理自体に時間がかかっても、終わってからカウントが始まる
    }, 
    1, // 1秒後に初回実行
    3, // 終了後、3秒休んでから次を開始
    TimeUnit.SECONDS
);
sequenceDiagram
    participant Timer as スケジューラ
    participant Task as タスク実行

    Note over Timer, Task: delay = 10秒, 処理時間 = 5秒 の場合

    Timer->>Task: 00:00 実行開始 (1回目)
    activate Task
    Task-->>Timer: 00:05 完了
    deactivate Task

    Note over Timer: 完了から10秒待機

    Timer->>Task: 00:15 実行開始 (2回目)
    activate Task
    Task-->>Timer: 00:20 完了
    deactivate Task
sequenceDiagram
    participant CPU
    Note over CPU: Delay = 5s
    CPU->>CPU: タスク1開始 (0s)
    activate CPU
    Note right of CPU: 実行時間: 2s
    CPU-->>CPU: タスク1終了 (2s)
    deactivate CPU
    Note over CPU: 常に5s待機
    CPU->>CPU: タスク2開始 (7s)
    activate CPU
    Note right of CPU: 実行時間: 2s
    CPU-->>CPU: タスク2終了 (9s)
    deactivate CPU

36. 例外発生時の挙動

試験で非常に重要なポイントです。

  • 定期実行タスク(FixedRate / FixedDelay)の実行中に例 外が発生すると、**その後のスケジュールはすべて停止**しま す。
  • エラーが起きても継続させたい場合は、タスク内部を try-catch で囲む必要があります。

37-40. 管理と終了

定期タスクは明示的に止めない限り走り続けます。

Java
// 37. cancel(): ScheduledFutureを使って特定のタスクを止める
future.cancel(false);

// 38. shutdown(): 新規タスクを拒否し、現在実行中のスケジュールを終えて停止
scheduler.shutdown();

// 39. 定期タスクの戻り値
// 定期タスクには Callable は使えず Runnable のみ。
// そのため Future.get() を呼んでも結果は常に null。

// 40. 実行時間の単位 (TimeUnit)
// SECONDS, MINUTES, HOURS, MILLISECONDS などが指定可能

💡 Java Gold 試験対策の「ひっかけ」まとめ

  1. FixedRate vs FixedDelay の図解問題:

    • FixedRate: 「開始時刻」から計算。タスクが重なると詰まって実行される。
    • FixedDelay: 「終了時刻」から計算。常に一定の「休み時間」が確保される。
  2. 戻り値の型:

    • schedule(1回限り)は Callable を受け取れる。
    • scheduleAtFixedRate / WithFixedDelayRunnable しか受け取れない。
  3. 例外による停止: 「コード内の例外がキャッチされていない場合、3回目の実行はど うなるか?」という問いに対し、「実行されない」と答えられる ようにしましょう。


次は、スレッドセーフなデータの器である 「41-55. スレッド セーフなコレクション」 に進みますか? ConcurrentHashMap など、実務でも必須の知識が登場します。