11. ScheduledExecutorService
ScheduledExecutorService は、 Java の「あとで実行」「定期実行」を行うためのインターフェースです。
場所:
java.util.concurrent
生成は普通これです。
⸻
- 主な関数一覧
| 関数 | 用途 |
|---|---|
| schedule() | 一回だけ遅延実行 |
| scheduleAtFixedRate() | 一定周期で実行 |
| scheduleWithFixedDelay() | 前回終了後に待って実行 |
| shutdown() | 新規受付停止 |
| shutdownNow() | 強制停止 |
| submit() | 非同期実行 |
| execute() | Runnable実行 |
⸻
1. schedule()¶
一定時間後に1回だけ実行。
Runnable版
サンプル
Text Only
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
scheduler.schedule(
() -> System.out.println("3秒後"),
3,
TimeUnit.SECONDS
);
scheduler.shutdown();
}
}
⸻
2. scheduleAtFixedRate()¶
開始時刻ベースの定期実行。
⸻
イメージ
⸻
サンプル
意味:
⸻
特徴
- 開始タイミングを揃える
- 処理が長いと詰まる
- 周期監視向き
⸻
3. scheduleWithFixedDelay()¶
終了時刻ベース。
⸻
イメージ
⸻
サンプル
Java
scheduler.scheduleWithFixedDelay(
() -> {
System.out.println("開始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
System.out.println("終了");
},
1,
3,
TimeUnit.SECONDS
);
⸻
特徴
- 前回終了を待つ
- 重複しにくい
- バッチ向き
⸻
scheduleAtFixedRate と scheduleWithFixedDelay の違い
| 項目 | FixedRate | FixedDelay |
|---|---|---|
| 基準 | 開始時刻 | 終了時刻 |
| 周期 | 一定 | 処理時間でズレる |
| 用途 | 定周期監視 | バッチ処理 |
⸻
4. shutdown()¶
正常終了。
scheduler.shutdown();
特徴:
- 新規タスク受付停止
- 実行中は最後まで実行
⸻
5. shutdownNow()¶
強制終了。
scheduler.shutdownNow();
特徴:
- 実行中スレッド interrupt
- 即停止を試みる
⸻
6. submit()¶
Callable や Runnable を非同期実行。
戻り値:
future.get()
で取得。
⸻
7. execute()¶
戻り値不要版。
⸻
TimeUnit
時間単位。
| 定数 | 意味 |
|---|---|
| SECONDS | 秒 |
| MILLISECONDS | ミリ秒 |
| MINUTE | 分 |
| HOURS | 時 |
| DAYS | 日 |
⸻
Java Gold 的重要ポイント
- Runnable と Callable
| 型 | 戻り値 |
|---|---|
| Runnable | void |
| Callable | 戻り値あり |
⸻
schedule 系戻り値
全部:
ScheduledFuture<?>
⸻
Executors生成
頻出です。
⸻
全体サンプル
Java
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
scheduler.schedule(
() -> System.out.println("1回"),
2,
TimeUnit.SECONDS
);
scheduler.scheduleAtFixedRate(
() -> System.out.println("周期"),
1,
3,
TimeUnit.SECONDS
);
}
}
⸻
覚え方
Java Gold ではかなり出やすい分野です。