import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class CompletableFutureExample {
private static final AtomicInteger taskCounter = new AtomicInteger(1);
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
String taskName = "Task-" + taskCounter.getAndIncrement();
System.out.println(taskName + " is running on thread: " + Thread.currentThread().getName());
// 模拟任务执行
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "Result from " + taskName;
}, executor);
future.thenAccept(System.out::println)
.exceptionally(ex -> {
System.err.println("An error occurred: " + ex.getMessage());
return null;
});
executor.shutdown();
}
}
supplyAsync
方法参数含义
- 第一个参数:
- 是一个实现了
Supplier
接口的 lambda 表达式或方法引用。Supplier
接口只有一个get
方法,它不接受参数,返回一个结果。在这里,() -> {... }
表示一个Supplier
,它定义了异步执行的具体任务逻辑,在上述代码中,该任务模拟了一段时间的执行,并返回一个字符串结果。
- 第二个参数:
- 是一个
Executor
对象,这里使用的executor
是自定义的线程池。CompletableFuture
会使用这个线程池中的线程来异步执行第一个参数所定义的任务。这样可以复用线程,提高性能,并且可以对线程进行统一管理,例如控制线程数量等。