组合式异步编程
异步任务管理
组合式编程在Java8这通过CompletableFature提供了强大的异步任务管理能力、
与Future/FutureTask对比
1.基本的任务执行服务
Java提供了ExecutorService来管理异步任务的执行。
可以通过Excutors工厂方法创建线程池。
ExecutorService executot = Eexcutors.newFixedThreadPool(4);
Future<String> future = executor.submit(() -> {
// 执行耗时操作
return "结果";
});
2.基本的CompletableFuture
CompletableFuture是一种强大的工具,可以表示一个异步计算的结果。
可以通过supplyAsync方法异步执行任务。
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
//耗时操作
return "异步结果";
});
3.CompletableFuture对Future的基本增强
CompletableFuture提供了更强的功能,例如
可以手动完成任务
可以通过组合多个异步任务创建复杂的任务流
可以处理异常
4.进一步理解Future/CompletableFuture
响应结果或异常
whenComplete:处理结果或异常
completableFuture.whenComplete((result,exception) -> {
if(exception != null){
System.out.println("出现异常:" + exception);
}else{
System.out.println("结果:" + result);
}
});
handle:类似于whenComplete,但可以返回一个新的值
completableFuture.handle((result,exception) -> {
if (exception != null){
return "处理异常"l
}
return "处理结果:" + result;
});
exceptionally:处理异常并返回一个默认值
completableFuture.exceptionalyy(exception -> {
return "默认值:" + exception.getMessage();
});
构建依赖单一阶段的任务流
1.thenRun:在前一个任务完成后运行一个没有输入的任务
completableFuture.thenRun(() ->{
System.out.println("任务完成后执行");
});
2.thenAccept:在前一个任务完成后运行一个有输入的任务
completableFuture.thenAccept(result -> {
System.out.println("结果:" + result);
});
thenApply:在前一个任务完成后处理结果并返回一个新值
completableFuture.thenApply(result -> {
return result.toUpperCase();
});
3.thenCompose:用于链接多个异步任务,返回一个新的CompletableFuture
completableFuture.thenCompose(result -> {
return CompletableFuture.supplyAsync(() -> result + "处理后");
});
构建依赖两个阶段的任务流
可以通过thenCombine将两个CompletableFuture的结果结合
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
future1.thenCombin(future2,(result1,result2) -> {
return result1 + " "+result2;
}).thenaAccept(System.out::println);
构建依赖多个阶段的任务流
可以通过thenCombine,thenCompose和其他组合方法来构建更复杂的依赖关系。
小结
CompletableFuture提供了更灵活和强大的异步编程能力,允许开发者以组合的方式构建复杂的异步任务流。
通过链式调用和错误处理,能够更有效地管理异步操作,提高代码的可读性和可维护性,