Java ComputableFuture 代码示例
CompletableFuture
是 Java 8 引入的一个强大的异步编程工具,它实现了 Future
接口并提供了更丰富的功能。以下是一些常见的 CompletableFuture
使用示例:
1. 基本用法
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureBasicExample {
public static void main(String[] args) {
// 创建一个CompletableFuture并异步执行任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, CompletableFuture!";
});
// 注册完成时的回调
future.thenAccept(result -> System.out.println("Result: " + result));
// 阻塞等待结果
try {
String result = future.get();
System.out.println("Main thread got: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
2. 链式调用
import java.util.concurrent.CompletableFuture;
public class CompletableFutureChainExample {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
// 第一个异步任务
System.out.println("Task 1 running in thread: " + Thread.currentThread().getName());
return "Hello";
}).thenApplyAsync(result -> {
// 第二个异步任务,接收上一个任务的结果
System.out.println("Task 2 running in thread: " + Thread.currentThread().getName());
return result + " World";
}).thenAcceptAsync(result -> {
// 第三个异步任务,消费最终结果
System.out.println("Task 3 running in thread: " + Thread.currentThread().getName());
System.out.println("Final result: " + result);
}).join(); // 等待所有任务完成
}
}
3. 组合多个 Future
import java.util.concurrent.CompletableFuture;
public class CompletableFutureCombineExample {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
// 合并两个Future的结果
CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (s1, s2) -> s1 + " " + s2);
combinedFuture.thenAccept(System.out::println).join();
}
}
4. 异常处理
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExceptionHandling {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
if (Math.random() > 0.5) {
throw new RuntimeException("Something went wrong!");
}
return "Success";
}).exceptionally(ex -> {
System.out.println("Exception occurred: " + ex.getMessage());
return "Recovered from exception";
}).thenAccept(System.out::println).join();
}
}
5. 并行执行多个任务
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CompletableFutureAllOfExample {
public static void main(String[] args) {
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
sleep(1);
return "Task 1";
});
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {
sleep(2);
return "Task 2";
});
CompletableFuture<String> task3 = CompletableFuture.supplyAsync(() -> {
sleep(3);
return "Task 3";
});
// 等待所有任务完成
CompletableFuture<Void> allFutures = CompletableFuture.allOf(task1, task2, task3);
// 获取所有任务的结果
CompletableFuture<String> combinedFuture = allFutures.thenApply(v -> {
String result1 = task1.join();
String result2 = task2.join();
String result3 = task3.join();
return result1 + ", " + result2 + ", " + result3;
});
System.out.println("Combined result: " + combinedFuture.join());
}
private static void sleep(int seconds) {
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
6. 超时处理(Java 9+)
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class CompletableFutureTimeoutExample {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Result";
});
// 设置超时时间为1秒
CompletableFuture<String> timeoutFuture = future.orTimeout(1, TimeUnit.SECONDS);
timeoutFuture.whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("Exception: " + ex.getClass().getName());
if (ex.getCause() instanceof TimeoutException) {
System.out.println("Task timed out");
}
} else {
System.out.println("Result: " + result);
}
}).join();
}
}
这些示例展示了 CompletableFuture
的主要功能,包括异步执行、链式调用、组合多个 Future、异常处理和超时控制等。CompletableFuture
是 Java 并发编程中非常强大的工具,可以大大简化异步编程的复杂性。