Skip to content
閲覧中:
11. ScheduledExecutorService

11. ScheduledExecutorService

ScheduledExecutorService は、 Java の「あとで実行」「定期実行」を行うためのインターフェースです。

場所:

java.util.concurrent

生成は普通これです。

Java
ScheduledExecutorService scheduler =
    Executors.newScheduledThreadPool(1);

  • 主な関数一覧
関数 用途
schedule() 一回だけ遅延実行
scheduleAtFixedRate() 一定周期で実行
scheduleWithFixedDelay() 前回終了後に待って実行
shutdown() 新規受付停止
shutdownNow() 強制停止
submit() 非同期実行
execute() Runnable実行

1. schedule()

一定時間後に1回だけ実行。

Runnable版

Java
schedule(Runnable command,
         long delay,
         TimeUnit unit)

サンプル

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()

開始時刻ベースの定期実行。

Java
scheduleAtFixedRate(
    Runnable command,
    long initialDelay,
    long period,
    TimeUnit unit
)

イメージ

Text Only
開始
↓3秒ごと
●---●---●---●

サンプル

Java
scheduler.scheduleAtFixedRate(
    () -> System.out.println("実行"),
    1,
    3,
    TimeUnit.SECONDS
);

意味:

Text Only
1秒後開始
以後3秒ごと

特徴

  • 開始タイミングを揃える
  • 処理が長いと詰まる
  • 周期監視向き

3. scheduleWithFixedDelay()

終了時刻ベース。

Java
scheduleWithFixedDelay(
    Runnable command,
    long initialDelay,
    long delay,
    TimeUnit unit
)

イメージ

Text Only
実行 → 終了 → 3秒待機 → 実行

サンプル

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 を非同期実行。

Java
Future<Integer> future =
    scheduler.submit(() -> 123);

戻り値:

future.get()

で取得。

7. execute()

戻り値不要版。

Java
scheduler.execute(
    () -> System.out.println("hello")
);

TimeUnit

時間単位。

定数 意味
SECONDS
MILLISECONDS ミリ秒
MINUTE
HOURS
DAYS

Java Gold 的重要ポイント

  • Runnable と Callable
戻り値
Runnable void
Callable 戻り値あり

schedule 系戻り値

全部:

ScheduledFuture<?>

Executors生成

Java
Executors.newScheduledThreadPool(1)

頻出です。

全体サンプル

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
        );
    }
}

覚え方

Text Only
schedule
→ 一回
FixedRate
→ 開始基準
FixedDelay
→ 終了基準

Java Gold ではかなり出やすい分野です。