返回CompletableFuture:Java 8功能亮点

本文介绍了Java 8中CompletableFuture如何扩展Future接口,提供异步编程的更多可能性。CompletableFuture允许显式完成操作,构建数据流程管道,并提供了丰富的方法如thenApply、thenAccept等。它类似于Guava的ListenableFuture,允许注册完成回调以响应异步事件。尽管如此,错误处理仍需注意,Takipi等工具可以帮助在生产环境中快速定位问题。CompletableFuture是异步编程趋势的重要部分,有助于提高效率。
摘要由CSDN通过智能技术生成

CompletableFuture与未来:与Java 8新功能保持异步

Java 8于2014年3月发布,并附带了许多新功能。 鲜为人知的,极为有用却被人误解的功能之一是对Future接口的全新改进,即扩展:CompletableFuture <T>。

在下面的文章中,我们将提供CompletableFuture的整体视图,以及它与简单的Future有何不同以及何时有用。

异步Java代码

Java 7向我们介绍了Future,它表示异步计算的结果。 使用Future对象的主要优点是,您可以在等待外部资源的同时做其他事情。 一种等待资源的非阻塞方式。

使用Future意味着您可以编写一个方法,而不是立即返回结果,而是将返回Future对象。 当您需要实际结果时,只需使用Future.get()即可在计算完成后返回该值。

您还可以得到方法检查计算是否是做的,一个办法取消/检查它是否被取消。

例如,假设您要调用某个外部资源,例如…… Marvel的开发人员API ,拔出所有名称中带有字母“ C”的超级英雄:

Future < String > marvel = executor.submit(new Callable < String > () {
    public String call() {
        return getMarvelHeroWithCharacter(“C”); // totally not making this up
    }
});

// other very important stuff of course, non-blocking ftw

System.out.println(marvel.get()); // this bit is blocking if the result isn’t ready yet

是的,如果我们确实想使用完全异步的非阻塞选项,那我们就不走运了。 我们无法保证未来确实存在,我们可能必须等待。 这是CompletableFuture出现的地方,它有助于解决棘手的问题。

那么,CompletableFuture有什么新功能?

CompletableFuture <T>扩展了Future <T>并使之……可完成。 考虑到Future对象在Java 8之前是受限制的,只有5种可用方法,所以这很重要。

此新的和改进的CompletableFuture具有2个主要优点:

  1. 可以通过调用complete()方法显式完成此操作,而无需任何同步等待。 它允许将来使用默认/中间结果,使用默认返回值提供任何类型的值,即使计算未完成。
  2. 使用数十种新方法,它还允许您通过一系列操作来构建管道数据流程。 您可以找到许多CompletableFuture模式,例如从任务创建CompletableFuture或构建CompletableFuture链。 可通过Oracle的CompletableFuture文档获得完整列表。

回到我们的简单示例,假设Marvel的API没有返回及时的结果,并且getMarvelHeroWithCharacter()仍在处理中,这是花时间的,而与此同时我们已经完成了其他所有想做的事情。 假设我们不想等待( 我们的生命结束了 ),CompletableFuture可以帮助我们返回中间结果。 像……神秘,因为在最坏的情况下,她可以变身为其他超级英雄。

CompletableFuture < String > marvel = executor.submit(new Callable < String > () {
    public String call() {
        return getMarvelHeroWithCharacter(“C”);
    }
});

// other stuff goes here

marvel.complete(“Mystique”); // sets a “default” value if not yet completed

System.out.println(marvel.get()); // non-blocking

您也可以预先创建一个完整的CompletableFuture,该函数将返回一个已知值。 如果您想将已知值与需要计算的值结合起来,这在测试环境中可能会派上用场:

CompletableFuture < String > cf =
    CompletableFuture.completedFuture("I'm done!");
cf.isDone(); // return true
cf.join(); // return "I'm done"

还有数十种其他更有用的方法可用,它们包括转换并作用于一个CompletableFuture(thenApply),完成时运行代码(thenAccept / thenRun),将两个CompletableFuture组合在一起等等。 要获得完整的指南,我们建议您阅读Java 8:CompletableFuture的权威指南

满足选择

如果您使用的是Guava或Scala(及其Futures ),则此新功能可能听起来很熟悉。 它与Guava的ListenableFuture相似,后者为Future对象定义了一个一致的API,用于注册完成回调。

与新的CompletableFuture相似,添加回调的功能允许以异步有效的方式响应传入的事件。 您可以注册要在计算完成后执行的回调,并支持基本Future接口不支持的许多操作。

线程

当艰难的时刻

使用CompletableFuture使我们能够与我们的代码一起运行,而不必等待结果,但是它仍然不能保证您的代码在生产中运行时不会中断。 发生错误时,您将需要尽快识别和分析它们,以部署修补程序。

对于此类情况, Takipi将使您能够在问题出现时有效地解决代码中的问题,而不必“等”到其他人遇到它们。

最后的想法

CompletableFuture恰好适合作为异步编程趋势的一部分,该趋势在过去几年中变得很流行。 难怪每个人都在谈论它,因为我们可以使用它同时运行许多任务,从而实现最佳工作流程。

如果您已经是异步编程的狂热爱好者,则可能需要查看我们有关7种您必须知道的反应性编程工具的文章

翻译自: https://www.javacodegeeks.com/2016/06/back-completablefuture-java-8-feature-highlight.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值