-> f.thenAccept(System.out::println))
//你可以把构成的Stream的所有CompletableFuture<void>对象放到一个数组中,等待所有的任务执行完成
.toArray(size -> new CompletableFuture[size]);
//allOf方法接受一个CompletableFuture构成的数组,数组中所有的COmpletableFuture对象执行完成后,
//它返回一个COmpletableFuture<Void>对象。所以你需要哦等待最初Stream中的所有CompletableFuture对象执行完毕,
//对allOf方法返回的CompletableFuture执行join操作
CompletableFuture.allOf(futures).join();
Connected to the target VM, address: '127.0.0.1:62278', transport: 'socket'
8twoprice :113.31
threeprice :108.15
oneprice :137.844
Disconnected from the target VM, address: '127.0.0.1:62278', transport: 'socket'
fourprice :119.2725
3768
还有一个方法anyOf,对于CompletableFuture对象数组中有任何一个执行完毕就不在等待时使用。
小结:
1.执行比较耗时的操作时,尤其是那些依赖一个或多个远程服务的操作,使用异步任务可以改善程序的性能,加快程序的响应速度。
2.你应该尽可能的为客户提供异步API。使用CompletableFuture类提供的特性,能够轻松的实现这一目标。
3.CompletableFuture类还提供了异常管理的机制,然给你有机会抛出/管理异步任务执行中发生的异常。
4.将同步API的调用封装到一个CompletableFuture中,你能够以异步的方式使用其结果。
5.如果异步任务之间互相独立,或者他们之间某一些的结果是另一些的输入,你可以讲这些异步任务合并成一个。
6.你可以为CompletableFuture注册一个回调函数,在Future执行完毕或者他们计算的结果可用时,针对性的执行一些程序。
7.你可以决定在什么时候将诶书程序的运行,是等待由CompletableFuture对象构成的列表中所有的对象都执行完毕,还是只要其中任何一个首先完成就终止程序的运行。