Java ScheduledExecutorServiceの例
Javaでは、ScheduledExecutorServiceを使用して、タスクを定期的に実行するか、事前定義されたTimeUnitの遅延後に1回実行することができます。
1. タスクを1回実行する
ScheduledExecutorServiceは、RunnableタスクとCallableタスクの両方を受け入れます。
1.1 Run a Runnable task after 5 seconds initial delay.
ScheduledExecutorExample.java
package com.example.concurrency.executor.scheduler;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorRunnable {
public static void main(String[] args) {
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
Runnable task2 = () -> System.out.println("Running task2...");
task1();
//run this task after 5 seconds, nonblock for task3
ses.schedule(task2, 5, TimeUnit.SECONDS);
task3();
ses.shutdown();
}
public static void task1() {
System.out.println("Running task1...");
}
public static void task3() {
System.out.println("Running task3...");
}
}
出力
Running task1... Running task3... Running task2... //display after 5 seconds
1.2 Run a Callable task after 5 seconds initial delay.
ScheduledExecutorExample.java
package com.example.concurrency.executor.scheduler;
import java.util.concurrent.*;
public class ScheduledExecutorCallable {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
Callable task2 = () -> 10;
task1();
//run this task after 5 seconds, nonblock for task3, returns a future
ScheduledFuture schedule = ses.schedule(task2, 5, TimeUnit.SECONDS);
task3();
// block and get the result
System.out.println(schedule.get());
System.out.println("shutdown!");
ses.shutdown();
}
public static void task1() {
System.out.println("Running task1...");
}
public static void task3() {
System.out.println("Running task3...");
}
}
出力
Running task1... Running task3... 10 //display after 5 seconds shutdown!
2. タスクを定期的に実行する
タスクを定期的に実行するには、scheduleAtFixedRateを使用します
2.1 Run a Runnable task every 1 second, after 5 seconds initial delay.
ScheduledExecutorExample.java
package com.example.concurrency.executor.scheduler;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorRepeat {
private static int count = 0;
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
Runnable task1 = () -> {
count++;
System.out.println("Running...task1 - count : " + count);
};
// init Delay = 5, repeat the task every 1 second
ScheduledFuture> scheduledFuture = ses.scheduleAtFixedRate(task1, 5, 1, TimeUnit.SECONDS);
while (true) {
System.out.println("count :" + count);
Thread.sleep(1000);
if (count == 5) {
System.out.println("Count is 5, cancel the scheduledFuture!");
scheduledFuture.cancel(true);
ses.shutdown();
break;
}
}
}
}
出力
count :0 count :0 count :0 count :0 count :0 Running...task1 - count : 1 count :1 Running...task1 - count : 2 count :2 Running...task1 - count : 3 count :3 Running...task1 - count : 4 count :4 Running...task1 - count : 5 Count is 5, cancel the scheduledFuture!
ソースコードをダウンロード
$ git clone https://github.com/example/java-concurrency.git