Exemples Java ScheduledExecutorService
En Java, nous pouvons utiliserScheduledExecutorService pour exécuter une tâche périodiquement ou une fois après un délai prédéfini deTimeUnit.
1. Exécuter une tâche une fois
LeScheduledExecutorService accepte les tâchesRunnable etCallable.
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...");
}
}
Sortie
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...");
}
}
Sortie
Running task1... Running task3... 10 //display after 5 seconds shutdown!
2. Exécuter une tâche périodiquement
Pour exécuter une tâche périodiquement, utilisescheduleAtFixedRate
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;
}
}
}
}
Sortie
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!
Télécharger le code source
$ git clone https://github.com/example/java-concurrency.git