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); Callabletask2 = () -> 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