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)