import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CompletableFutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);
// 定义并行执行的任务1
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
System.out.println("Task1 is running asynchronously.");
// 模拟一些耗时操作
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Result of Task1";
}, executorService);
// 定义并行执行的任务2
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {
System.out.println("Task2 is running asynchronously.");
// 模拟一些耗时操作
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Result of Task2";
}, executorService);
// 定义依赖于并行任务结果的顺序执行任务
CompletableFuture<Void> combinedTask = CompletableFuture.allOf(task1, task2)
.thenRun(() -> {
try {
System.out.println("Combined task starts, depends on Task1 and Task2.");
System.out.println("Task1 result: " + task1.get());
System.out.println("Task2 result: " + task2.get());
// 模拟依赖任务的一些操作
Thread.sleep(1000);
System.out.println("Combined task finishes.");
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
});
// 等待所有任务完成
combinedTask.get();
// 关闭线程池
executorService.shutdown();
}
}
代码说明
- 线程池创建:
ExecutorService executorService = Executors.newFixedThreadPool(3);
创建一个固定大小为3的线程池,用于异步执行任务。
- 并行任务定义:
task1
和 task2
是两个并行执行的任务,使用 CompletableFuture.supplyAsync
方法,传入一个有返回值的任务和线程池。每个任务模拟了一个耗时操作,并返回任务执行结果。
- 依赖任务定义:
CompletableFuture.allOf(task1, task2)
等待 task1
和 task2
都完成。
.thenRun(() -> {... })
在 task1
和 task2
都完成后,执行后续任务。在这个后续任务中,获取 task1
和 task2
的结果,并模拟了一些依赖于前两个任务结果的操作。
- 等待任务完成并关闭线程池:
combinedTask.get();
等待所有任务完成。
executorService.shutdown();
关闭线程池。