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 試験対策の「ひっかけ」まとめ¶
-
FixedRate vs FixedDelay の図解問題:
- FixedRate: 「開始時刻」から計算。タスクが重なると詰まって実行される。
- FixedDelay: 「終了時刻」から計算。常に一定の「休み時間」が確保される。
-
戻り値の型:
schedule(1回限り)はCallableを受け取れる。scheduleAtFixedRate/WithFixedDelayはRunnableしか受け取れない。
-
例外による停止: 「コード内の例外がキャッチされていない場合、3回目の実行はど うなるか?」という問いに対し、「実行されない」と答えられる ようにしましょう。
次は、スレッドセーフなデータの器である 「41-55. スレッド
セーフなコレクション」 に進みますか? ConcurrentHashMap
など、実務でも必須の知識が登場します。