返回CompletableFuture:Java 8功能亮点

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 ftwSystem.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 heremarvel.complete(“Mystique”); // sets a “default” value if not yet completedSystem.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 操作 mysql 数据库常用方法集合

参考&#xff1a; https://www.runoob.com/php/php-pdo.html https://www.cnblogs.com/feng18/p/6523646.html https://blog.csdn.net/zuiliannvshen/article/details/78247244 转载于:https://www.cnblogs.com/gavinyyb/p/9543844.html

接口功能测试策略

由于平台服务器是通过接口来与客户端交互数据提供各种服务&#xff0c;因此服务器测试工作首先需要进行的是接口测试工作。测试人员需要通过服务器接口功能测试来确保接口功能实现正确&#xff0c;那么其他测试人员进行客户端与服务器结合的系统测试过程中&#xff0c;就能够排…

matlab中sort(d),MATLAB中排序函数sort()的用法

MATLAB中排序函数sort()可以对参数的元素进行升序排序或降序排序。具体的用法如下&#xff1a;Ysort(X)sort()的参数可以是向量&#xff0c;矩阵&#xff0c;数组等等。当X是向量时&#xff0c;sort(X)对X的元素进行升序排序&#xff1b;当X是矩阵时&#xff0c;sort(X)对X的每…

cin、cin.get()、cin.getline()、getline()、gets()函数的用法

1、cin>> 用法1&#xff1a;最基本&#xff0c;也是最常用的用法&#xff0c;输入一个数字&#xff1a; #include <iostream> using namespace std; main () { int a,b; cin>>a>>b; cout<<ab<<endl; } 输入&#xff1a;2[回车]3…

BootCDNApi使用记录

通过API获取BootCDN所加速的所有前端开源库的基本信息和文件列表 API 将一下API链接中的.min字样去掉后,获取到的JSON格式的返回信息是经过良好的格式化的,便于查看. 所有开源库简要信息列表 https://api.bootcdn.cn/libraries.min.json 该列表是一个json数组,数组中的每一个条…

spring防止爬虫_Spring安全:防止暴力攻击

spring防止爬虫Spring Security可以为您做很多事情。 帐户被封锁&#xff0c;密码盐。 但是蛮力阻断剂呢&#xff1f; 那是你必须自己做的。 幸运的是&#xff0c;Spring是一个非常灵活的框架&#xff0c;因此对其进行配置并不是什么大问题。 让我向您展示一些如何针对Grai…

php 输出读取结果集,php获取数据库结果集实例详解

下面小编就为大家带来一篇php获取数据库结果集方法(推荐)。小编觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来看看吧PHP经常要访问数据库提前数据库里面的数据&#xff0c;那么该怎么样去提前数据呢&#xff1f;提取数据库代码如下…

c/c++ 模板与STL小例子系列一 自建Array数组

c/c 模板与STL小例子系列 自建Array数组 自建的Array数组&#xff0c;提供如下对外接口 方法功能描述Array()无参数构造方法&#xff0c;构造元素个数为模板参数个的数组Array(int length)有参数构造方法&#xff0c;构造元素个数为参数length个的数组~Array()析构函数int size…

php如何抓取一行的内容,提取一行作为对象 - PHP 7 中文文档

(PHP 4, PHP 5, PHP 7)pg_fetch_object – 提取一行作为对象说明pg_fetch_object( resource $result[, int $row[, int $result_type]] ) : objectpg_fetch_object() 返回与所提取行的属性相一致的一个对象。如果出错或者没有更多行可供提取时则返回 FALSE。pg_fetch_object() …

Spring Cloud Zuul支持–配置超时

Spring Cloud为Netflix Zuul提供了支持 -Netflix Zuul是用于创建具有路由和过滤功能的边缘服务的工具包。 在Spring Cloud站点上非常全面地记录了Zuul代理支持。 我的目标是关注与代理服务处理超时有关的一小部分属性。 目标服务和网关 为了更好地研究超时&#xff0c;我创建…

NYOJ 113

字符串替换 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;2描述 编写一个程序实现将字符串中的所有"you"替换成"we" 输入输入包含多行数据 每行数据是一个字符串&#xff0c;长度不超过1000 数据以EOF结束输出对于输入的…

java 多表格处理工具,表单工具十一大标准

现在市场上的表单工具百家争鸣&#xff0c;鱼目混杂。到底什么时候能解决客户问题表单&#xff0c;今天我们主要从客户角度来真正表单工具的十大标准&#xff1a;1) 零编码制作表单业务人员通过高效灵活的设计器&#xff0c;可以自由定制符合自己业务逻辑的表单&#xff0c;同时…

关于python的单线程和多线程

单线程 比如两件事&#xff0c;要相继执行&#xff0c;而不是一起执行 学习一下单线程和多线程的问题from time import ctime,sleep 单线程 print(单线程开始&#xff1a;) def music_single(name):for i in range(2):print(i was listening to music %s. %s %(name,ctime()))s…

C语言itoa()函数和atoi()函数详解(整数转字符C实现)

C语言提供了几个标准库函数&#xff0c;可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。1.int/float to string/array: C语言提供了几个标准库函数&#xff0c;可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串&#xff0c;下面列举了各函数的方法及其说…

exo文件_您在eXo平台上的第一个Juzu Portlet

exo文件菊珠是佛教的佛珠。 一句话&#xff0c;我相信您已经学到了什么&#xff0c;印象深刻吗&#xff1f; 好吧&#xff0c;我在这里不谈论佛教。 Juzu还是一个用于快速开发Portlet&#xff08;以及即将推出的独立应用程序&#xff09;的新框架。 您可以在Juzu网站上找到所需…

matlab指定间隔符,在matlab中为.dat文件指定小数分隔符[复制]

您必须以文本形式读取数据(使用textscan,textread,dlmread,etc.)并转换为数字.假设您已将数据读入单元格数组,其中包含单元格中的每个数字&#xff1a;>> C {1,2345,3,14159,2,7183,1,4142,0,7071}C 1,2345 3,14159 2,7183 1,4142 0,7071使用strrep和str2double如下&…

volatile、static

谈到 volatile、static 就必须说多线程。 1、一个线程在开始执行的时候&#xff0c;会开启一片自己的工作内存&#xff08;自己线程私有&#xff09;&#xff0c;同时将主内存中的数据复制到自己 的工作内存&#xff0c;从此读写数据都是自己的工作内存的数据&#xff0c;&…

最大流EK算法

最大流模板&#xff1a; #include <iostream> #include <queue> //#include <conio.h> using namespace std; #define arraysize 201 int maxData 0x7fffffff; int capacity[arraysize][arraysize]; //记录残留网络的容量 int flow[arraysize]; …

将自定义功能添加到Spring数据存储库

Spring Data非常方便&#xff0c;并且避免了样板代码&#xff0c;从而加快了开发速度。 但是&#xff0c;在某些情况下&#xff0c;注释查询不足以实现您可能想要实现的自定义功能。 因此&#xff0c;spring数据允许我们向Spring数据存储库添加自定义方法。 我将使用前一篇博客…

mysql concat的使用

想要在一个id前都加个0,如果处理呢? mysql concat的使用 update a_data set idCONCAT(0, id) where data_packet_id in (2774, 2775, 2776);转载于:https://www.cnblogs.com/djwhome/p/9554086.html