最近组内分享了一下java 8中的CompletableFuture特性感觉非常赞的一个功能。
下面小记一下基本的使用:
1.使用场景
- 将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第一个的结果。
- 等待 Future 集合中的所有任务都完成 或者 仅等待 Future 集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同一个值),并返回它的结果。
- 应对 Future 的完成事件(即当 Future 的完成事件发生时会收到通知,并能使用 Future计算的结果进行下一步的操作,不只是简单地阻塞等待操作的结果)
- 多个Future 结果之间的依赖性。
2.使用DEMO
//DEMO 1 :异步执行、异常处理
CompletableFuture<String> completableFuture=new CompletableFuture();
new Thread(()->{
//模拟执行耗时任务
System.out.println("task doing...");
try {
Thread.sleep(3000);
throw new RuntimeException("抛出异常");
} catch (InterruptedException e) {
//异常处理
completableFuture.completeExceptionally(e);
}
//告诉completableFuture任务已经完成
completableFuture.complete("result");
}).start();
//获取任务结果,如果没有完成会一直阻塞等待
String result=completableFuture.get();
System.out.println("计算结果:"+result);
CompletableFuture<String> completableFuture2=CompletableFuture.supplyAsync(()->{
try {
Thread.sleep(3000);
}catch (Exception e){
return "fail";
}
return "success";
});
//DEMO 2 :anyOf 或者 allOf
CompletableFuture<Object> anyResult=CompletableFuture.anyOf(completableFuture,completableFuture2);
System.out.println("第一个完成的任务结果:"+anyResult.get());
CompletableFuture<Void> allResult=CompletableFuture.allOf(completableFuture,completableFuture2);
//阻塞等待所有任务执行完成
allResult.join();
System.out.println("所有任务执行完成");
//DEMO 3 :第一个的结果作为第二个的入参
CompletableFuture completableFuture3=completableFuture2.thenCompose(o->CompletableFuture.supplyAsync(()->{
System.out.println(o);
return "success";
}));
completableFuture3.get();
//DEMO 4:全不相干的 CompletableFuture 对象的结果整合起来,而且你也不希望等到第一个任务完全结
CompletableFuture completableFuture4=completableFuture2.thenCombine(completableFuture,(o1,o2)-> o1+o2);
completableFuture4.get();
//DEMO 5:CompletableFuture 完成执行后回调函数
completableFuture4.thenAccept(result2->{
System.out.println(result);
});