Java 一定間隔で実行する(scheduleAtFixedRate)

Javaの一定間隔で実行するメソッドのサンプルです。
以下3つのメソッドはScheduledExecutorServiceインタフェースのメソッドです。

目次

サンプル 指定時間経過後に1回実行する(schedule)
  一定間隔で実行する(scheduleAtFixedRate)
  一定間隔で実行する(scheduleWithFixedDelay)

指定時間経過後に1回実行する(schedule)

public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit);
  • scheduleは、指定時間経過後に1回実行します。
  • 1つめの引数は、実行するコマンドを指定します。
  • 2つめの引数は、実行を遅延させる時間を指定します。
  • 3つめの引数は、遅延する時間の単位です。TimeUnit.SECONDSは秒です。
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test1 {
	public static void main(final String[] arguments) throws InterruptedException {
        ScheduledExecutorService service 
        	= Executors.newSingleThreadScheduledExecutor();

        service.schedule(() -> {
            System.out.println("実行");
        }, 3, TimeUnit.SECONDS);
        
        service.shutdown();
	}
}

8行目のExecutorsはファクトリでインスタンスを生成します。
開始から3秒後に11行目の文字列が表示されます。

shutdownメソッドを実行しない場合、プロセスが残る場合があるので注意が必要です。

 

一定間隔で実行する(scheduleAtFixedRate)

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit);
  • scheduleAtFixedRateは、一定間隔で実行します。
  • 1つめの引数は、実行するコマンドを指定します。
  • 2つめの引数は、最初の実行を遅延させる時間を指定します。
  • 3つめの引数は、実行間隔です。
  • 4つめの引数は、遅延する時間の単位です。TimeUnit.SECONDSは秒です。
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test1 {
	public static void main(final String[] arguments) throws InterruptedException {
		ScheduledExecutorService service 
			= Executors.newSingleThreadScheduledExecutor();

		System.out.println("ID=" + Thread.currentThread().getId()); // 1

		service.scheduleAtFixedRate(() -> {
			System.out.println(
					"ループ内のID=" + Thread.currentThread().getId()); // 12
		}, 0, 3, TimeUnit.SECONDS);

		while (true) {
			TimeUnit.SECONDS.sleep(1);
			System.out.println("ID=" + Thread.currentThread().getId()); // 1
		}
	}
}

8行目のExecutorsはファクトリでインスタンスを生成します。
14行目は、実行を開始した時点を基準に3秒ごとに文字列とスレッドIDが出力されます。
仮に実行時間が3秒を超えた場合は実行されません。実行中の処理が完了後開始されます。
ループ外のスレッドIDとループ内のスレッドIDは別になります。

 

一定間隔で実行する(scheduleWithFixedDelay)

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit);
  • scheduleWithFixedDelayは、一定間隔で実行します。
  • 1つめの引数は、実行するコマンドを指定します。
  • 2つめの引数は、最初の実行を遅延させる時間を指定します。
  • 3つめの引数は、実行間隔です。
  • 4つめの引数は、遅延する時間の単位です。TimeUnit.SECONDSは秒です。
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test1 {
	public static void main(final String[] arguments) throws InterruptedException {
		ScheduledExecutorService service 
			= Executors.newSingleThreadScheduledExecutor();

		System.out.println("ID=" + Thread.currentThread().getId()); // 1

		service.scheduleWithFixedDelay(() -> {
			System.out.println(
					"ループ内のID=" + Thread.currentThread().getId()); // 12
		}, 0, 3, TimeUnit.SECONDS);

		while (true) {
			TimeUnit.SECONDS.sleep(1);
			System.out.println("ID=" + Thread.currentThread().getId()); // 1
		}
	}
}

8行目のExecutorsはファクトリでインスタンスを生成します。
14行目は、実行を終了した時点を基準に3秒ごとに文字列とスレッドIDが出力されます。
ループ外のスレッドIDとループ内のスレッドIDは別になります。

https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/ScheduledExecutorService.html

関連の記事

Java replace 文字列を置換するサンプル
Java split 文字列を分割して配列にする
Java 文字列の文字の位置を取得するサンプル(indexOfとlastIndexOf)

△上に戻る