Java 8新特性之CompletableFuture:组合式异步编程(6)

在本章中,所有的延迟例子都是延迟1秒钟,但是在现实世界中,有时可能更糟。到目前为止,你所实现的方法必须等待所有的商品返回时才能现实商品的价格。而你希望的效果是,只要有商品返回商品价格就在第一时间显示出来,不用等待那些还没有返回的商品。

CompletableFuture[] futures = shops.stream()
                .map(shop -> CompletableFuture.supplyAsync(
                        () -> shop.getPrice("hhhhh", executor)
                ))
                .map(future -> future.thenApply(Quote::parse))
                .map(future -> future.thenCompose(quote ->
                        CompletableFuture.supplyAsync(
                                () -> Discount.applyDiscount(quote), executor)
                ))
                //在每个CompletableFuture上注册一个操作,该操作会在CompletableFuture完成后使用它的返回值。
                //使用thenAccept将结果输出,它的参数就是 CompletableFuture的返回值。
                .map(f -> 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对象构成的列表中所有的对象都执行完毕,还是只要其中任何一个首先完成就终止程序的运行。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e024cc39655ece152be623006fedb425.html