Java 8 中 CompletableFuture 的 20 个实用示例分享
在 Java 8 中,CompletableFuture 为异步编程提供了强大而灵活的工具。以下为您分享 20 个实用示例,帮助您更好地理解和运用 CompletableFuture。
示例 1:简单的异步任务
CompletableFuture future = CompletableFuture.runAsync(() -> {
// 执行耗时操作
System.out.println("异步任务执行");
});
示例 2:异步任务并返回结果
CompletableFuture resultFuture = CompletableFuture.supplyAsync(() -> {
return "异步计算的结果";
});
示例 3:组合多个 CompletableFuture
CompletableFuture future1 = CompletableFuture.supplyAsync(() -> "任务 1 结果");
CompletableFuture future2 = CompletableFuture.supplyAsync(() -> "任务 2 结果");
CompletableFuture combinedFuture = CompletableFuture.allOf(future1, future2);
示例 4:处理异常
CompletableFuture future = CompletableFuture.runAsync(() -> {
throw new RuntimeException("模拟异常");
}).exceptionally(ex -> {
System.out.println("处理异常: " + ex.getMessage());
return null;
});
示例 5:转换结果
CompletableFuture sourceFuture = CompletableFuture.supplyAsync(() -> "原始结果");
CompletableFuture transformedFuture = sourceFuture.thenApply(result -> result.length());
示例 6:异步任务的串行执行
CompletableFuture future1 = CompletableFuture.runAsync(() -> {
System.out.println("任务 1 执行");
});
CompletableFuture future2 = future1.thenRun(() -> {
System.out.println("任务 2 执行");
});
示例 7:根据条件执行不同的操作
CompletableFuture future = CompletableFuture.supplyAsync(() -> "结果");
CompletableFuture conditionBasedFuture = future.thenCompose(result -> {
if (result.length() > 5) {
return CompletableFuture.supplyAsync(() -> "长结果");
} else {
return CompletableFuture.supplyAsync(() -> "短结果");
}
});
示例 8:处理多个异步任务的结果
CompletableFuture future1 = CompletableFuture.supplyAsync(() -> "结果 1");
CompletableFuture future2 = CompletableFuture.supplyAsync(() -> "结果 2");
CompletableFuture combinedResultFuture = CompletableFuture.anyOf(future1, future2)
.thenApply(obj -> {
if (obj == future1.get()) {
return "选择了结果 1";
} else {
return "选择了结果 2";
}
});
示例 9:超时处理
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "结果";
}).completeOnTimeout("超时结果", 1000);
示例 10:多个异步任务的顺序执行
CompletableFuture future1 = CompletableFuture.runAsync(() -> {
System.out.println("任务 1 执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture future2 = future1.thenRunAsync(() -> {
System.out.println("任务 2 执行");
});
示例 11:异常传播
CompletableFuture future = CompletableFuture.runAsync(() -> {
throw new RuntimeException("异常");
}).handle((result, ex) -> {
if (ex!= null) {
System.out.println("捕获异常: " + ex.getMessage());
}
return null;
});
示例 12:重复执行
CompletableFuture future = CompletableFuture.runAsync(() -> {
System.out.println("第一次执行");
});
future.thenRun(() -> {
System.out.println("第二次执行");
});
示例 13:结果合并
CompletableFuture future1 = CompletableFuture.supplyAsync(() -> "结果 1");
CompletableFuture future2 = CompletableFuture.supplyAsync(() -> "结果 2");
CompletableFuture mergedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + result2);
示例 14:回调执行
CompletableFuture future = CompletableFuture.supplyAsync(() -> "结果");
future.thenAccept(result -> {
System.out.println("接收结果: " + result);
});
示例 15:条件判断
CompletableFuture future = CompletableFuture.supplyAsync(() -> "结果");
CompletableFuture conditionFuture = future.thenAcceptWhen(result -> result.length() > 5, () -> {
System.out.println("满足条件");
});
示例 16:等待所有任务完成
CompletableFuture future1 = CompletableFuture.runAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务 1 完成");
});
CompletableFuture future2 = CompletableFuture.runAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务 2 完成");
});
CompletableFuture allFutures = CompletableFuture.allOf(future1, future2);
allFutures.join();
示例 17:任务取消
CompletableFuture future = CompletableFuture.runAsync(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 执行任务
}
});
// 取消任务
future.cancel(true);
示例 18:任务完成通知
CompletableFuture future = CompletableFuture.runAsync(() -> {
System.out.println("任务执行");
});
future.whenComplete((result, ex) -> {
if (ex == null) {
System.out.println("任务完成");
} else {
System.out.println("任务异常");
}
});
示例 19:异步任务链
CompletableFuture future1 = CompletableFuture.supplyAsync(() -> "结果 1");
CompletableFuture future2 = future1.thenApply(result -> result + " 结果 2");
CompletableFuture future3 = future2.thenApply(result -> result + " 结果 3");
示例 20:自定义线程池
ExecutorService executor = Executors.newFixedThreadPool(5);
CompletableFuture future = CompletableFuture.runAsync(() -> {
System.out.println("异步任务执行");
}, executor);
通过以上 20 个实用示例,相信您对 Java 8 中的 CompletableFuture 有了更深入的理解和掌握,能够在实际开发中更高效地运用异步编程。