谷歌guava_Google Guava –期货

谷歌guava

这篇文章是我在Google Guava上的系列文章的延续,这次涵盖了Future。 Futures类是用于使用Future / ListenableFuture接口的静态实用程序方法的集合。 Future是已提交给ExecutorService的异步任务(可运行或可调用)的句柄。 Future接口提供以下方法:获取任务的结果,检查任务是否完成或取消任务。 ListenableFuture接口扩展了Future接口,并添加了将完成侦听器设置为在任务完成后运行的功能。 要创建ListenableFuture,您首先需要装饰ExecutorService实例,如下所示:

ExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());

现在,所有提交的Callables / Runnables将返回一个ListenableFuture。 MoreExecutors可以在com.google.common.util.concurrent包中找到。 ListenableFutures在覆盖以前的帖子 。 期货中有太多方法无法有效地涵盖在一篇文章中,所以我只涉及:链,转换,allAsList和successAsList。 在整个这篇文章中,我将交替使用Future和ListenableFutures。

链方法返回一个ListenableFuture,其值是通过从输入Future中获取结果并将其作为参数应用到Function对象来计算的, Function对象又返回另一个ListenableFuture。 让我们看一个代码示例并逐步执行它:

ListenableFuture<List<String>> indexSearch = luceneSearcher.searchAsync('firstName:martin');Function<List<String>, ListenableFuture<List<Person>>> queryFunction = new Function<List<String>, ListenableFuture<List<Person>>>() {@Overridepublic ListenableFuture<List<Person>> apply(final List<String> ids) {return dataService.getPersonsByIdAsync(ids);}};ListenableFuture<List<Person>> results = Futures.chain(indexSearch, queryFunction,executorService);
  1. 第1行正在使用Lucene执行异步搜索,并将返回一个ID列表,这些ID代表存储在数据库中的人员记录的主键。 (我创建了一个小索引,其中存储在Lucene中的唯一数据是id的数据,其余数据仅被索引了)。
  2. 第4 – 11行正在构建功能对象,其中apply方法将使用搜索未来的结果作为输入。 从apply返回的将来是对dataService对象的调用的结果。
  3. 第12行是从链调用返回的未来。 一旦输入将来完成,将使用executorService运行该功能。

为了更加清楚,这是searchAsync和getPersonsByIdAsync方法的作用。 在前面的代码示例中,这些方法调用分别来自第2行和第8行:

public ListenableFuture<List<String>> searchAsync(final String query)  {return executorService.submit(new Callable<List<String>>() {@Overridepublic List<String> call() throws Exception {return search(query);}});}public ListenableFuture<List<Person>> getPersonsByIdAsync(final List<String> ids) {return executorService.submit(new Callable<List<Person>>() {@Overridepublic List<Person> call() throws Exception {return getPersonsById(ids);}});}

chain方法具有两个签名:

  1. 链(ListentableFuture,函数)
  2. 链(ListenableFuture,函数,ExecutorService)

在确定使用哪种方法时,需要考虑几点。
如果通过调用时间链完成了输入将来,则所提供的函数将在调用线程中立即执行。 此外,如果未提供执行程序,则使用MoreExecutors.sameThreadExecutor。 MoreExecutors.sameThreadExecutor(顾名思义)位于ThreadPoolExecutor.CallerRunsPolicy之后,这意味着提交的任务在与执行/提交相同的线程中运行。

转变

转换方法类似于链式方法,因为它以Future和Function对象作为参数。 区别在于,不返回ListenableFuture,仅返回将给定功能应用于输入future的结果。 考虑以下:

List<String> ids = ....
ListenableFuture<List<Map<String, String>>> dbRecords =   dataService.getPersonDataByIdAsync(ids);Function<List<Map<String, String>>,List<Person>> transformDbResults = new Function<List<String>, List<Person>>() {@Overridepublic List<Person> apply(List<Map<String, String>> personMapList) {List<Person> personObjList = new ArrayList<Person>();for(Map<String,String> personDataMap : personMapList){personObjList.add(new Person(personDataMap);} return personObjList;}};ListenableFuture<List<Person>> transformedResults = Futures.transform(dbRecords, transformDbResults, executorService);
  1. 第2行执行异步数据库查找
  2. 在第4行上,正在创建一个函数对象,但是在第8行上,请注意返回类型为List <Person>

transform方法具有与chain相同的重载方法调用,但有相同的警告。

AllAsList

allAsList方法将采用任意数量的ListenableFutures作为变量或以Iterator <ListenableFuture>的形式。 返回一个ListenableFuture,其值是所有输入结果的列表。 列表中返回的值与原始列表的顺序相同。 如果任何输入值被取消或失败,则返回的ListenableFuture也将被取消或失败。 从allAsList调用取消返回的future不会传播到列表中提交的任何原始任务。

ListenableFuture<List<Person>> lf1 = getPersonsByFirstNameFuture('martin');
ListenableFuture<List<Person>> lf2 = getPersonsByFirstNameFuture('bob');
ListenableFuture<List<List<Person>>> lfResults = Futures.allAsList(lf1, lf2);
//assume lf1 failed
List<List<Person>> personLists = lfResults.get() //call results in exception


成功名单

successAsList方法与allAsList非常相似,但是更加宽容。 就像allAsList一样,successAsList返回结果列表的顺序与输入列表的顺序相同,但是如果任何输入失败或被取消,则列表中的相应值将为null。 取消返回的将来也不会取消任何原始输入。

ListenableFuture<List<Person>> lf1 = getPersonsByFirstNameFuture('martin');
ListenableFuture<List<Person>> lf2 = getPersonsByFirstNameFuture('bob');
ListenableFuture<List<List<Person>>> lfResults = Futures.successfulAsList(lf1, lf2);
//assume lf1 failed
List<List<Person>> personLists = lfResults.get();
List<Person> listOne = personLists.get(0) //listOne is null
List<Person> listTwo = personLists.get(1) //listTwo, not null


结论

希望这有助于从Google Guava发现Futures类中包含的有用性。 我创建了一个单元测试,以显示本文中描述的方法的示例用法。 由于有大量支持代码,因此我在gihub上创建了一个项目guava-blog 。 该项目还将包含我以前在Guava上的帖子( Monitor , ListenableFuture )中的源代码。 一如既往地欢迎提出意见和建议。

资源资源

  • 番石榴项目首页
  • 期货API
  • 博客系列的源代码


参考资料: Google Guava –我们的JCG合作伙伴 Bill Bejeck撰写的期货,来自Random Thoughts On Coding博客。

翻译自: https://www.javacodegeeks.com/2012/11/google-guava-futures.html

谷歌guava

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

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

相关文章

北航计算机组成原理ppt,北航计算机组成原理课件.ppt

北航计算机组成原理课件本讲内容 透视计算机&#xff1a;计算机组成与结构总结 组成部件 内部连接 理解计算机&#xff1a;机器指令的执行过程 计算机最基本的操作与控制&#xff1a;微操作 指令的执行过程 程序的执行 计算机的时序控制方式 时序系统简介 计算机结构(Architect…

urllib2使用总结

keywords: urllib2,BeautifulSoup,cookielib 题外话: 小弟是编程爱好者&#xff0c;各位看官轻拍。 最近在使用urllib2抓取网页内容&#xff0c;在学习的过程中也查阅了不少资料,并从中收获很多。在查阅资料的过程中&#xff0c;我发现大部分资料都是建立在对urllib2的熟悉基…

Linux基础第五课——用户管理

用户管理 一个用户必须有一个主组一个用户可以拥有多个组 但是必须一个主组 其它组是临时组一个组可以拥有多个用户用户的信息放到 /etc/passwd 用户的密码 存入 /etc/shadow 组信息存到 /etc/group添加用户 add useradd shengliang 这时候会在 /etc/passwd 下生成一条记录 she…

降调软件测试自学,普通话测试及变调.ppt

普通话测试及变调(二)去声变调 当两个去声字相连&#xff0c;前面的去声字不读重音的时候&#xff0c;调值由全降变为半降&#xff0c;51变为53。 错误 汉字 介绍 注意 外地 善意 艺术 戏剧 预告 降落 锻炼 倒退 大会 自治 迫害 照相 木料 正确 “一”变调?? ?1.??“一”在…

信守承诺:JAX-RS API的基于合同的测试

自从我们谈论测试和应用有效的TDD实践以来已经有一段时间了&#xff0c;特别是与REST&#xff08;ful&#xff09; Web服务和API相关的实践。 但是&#xff0c;这个主题永远都不应忘记&#xff0c;特别是在每个人都在做微服务的世界中&#xff0c;无论它意味着什么&#xff0c;…

P2084 进制转换

原题链接 https://www.luogu.org/problemnew/show/P2084 这个题的思路就是先将输入的数字存到字符数组里&#xff0c;然后求出这一串数字中的非0元素的个数total&#xff0c;并记录最后一位非0元素的位置。输出时&#xff0c;先输出total-1个&#xff0c;最后再补上第total个&a…

关于C++ const 的全面总结

C中的const关键字的用法非常灵活&#xff0c;而使用const将大大改善程序的健壮性&#xff0c;本人根据各方面查到的资料进行总结如下&#xff0c;期望对朋友们有所帮助。 Const 是C中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型&#xff0c;常类型的变量或对象…

国家普通话水平智能测试软件,国家普通话水平智能测试系统注意事项

国家普通话水平智能测试系统注意事项导语&#xff1a;为了让考生更顺利的通过普通话考试&#xff0c;下面是小编给大家提供的国家普通话水平智能测试系统注意事项&#xff0c;大家可以参考阅读&#xff0c;更多详情请关注应届毕业生考试网。一、登录阶段&#xff1a;1. 请正确佩…

从尾到头打印链表

题目描述 输入一个链表&#xff0c;按链表值从尾到头的顺序返回一个ArrayList。 python solution&#xff1a; # -*- coding:utf-8 -*- class ListNode:def __init__(self, x):self.val xself.next Noneclass Solution:# 返回从尾部到头部的列表值序列&#xff0c;例如[1,2,3…

Advanced C++ -- Logic Constness and Bitwise Constness

首先介绍一下什么是Logic Constness和Bitwise Constness&#xff0c;Logic Constness指的是function 后的const修饰&#xff0c;我们只知道这个function被const修饰了&#xff0c;但是并没有任何变量被const&#xff0c;Bitwise Constness指的是变量&#xff08;指针&#xff0…

计算机社团竞选优势6,社团社长竞选稿六篇

社团社长竞选稿六篇在社会一步步向前发展的今天&#xff0c;用到竞选稿的地方越来越多&#xff0c;竞选稿可以帮助竞选者更好地表达。还是对竞选稿一筹莫展吗&#xff1f;以下是小编为大家收集的社团社长竞选稿6篇&#xff0c;仅供参考&#xff0c;希望能够帮助到大家。社团社长…

使用Spring创建用于JUnit测试的JNDI资源

直到最近&#xff0c;我还使用静态方法来设置内存数据库&#xff08;HSQLDB&#xff09;。 我在JUnit测试的setUp / tearDown中调用了这些方法。 当我使用Spring时&#xff0c;这总是让我感到不自然&#xff0c;并且所有内容都应在其应用程序上下文中运行。 创建一个简单的JND…

安装Office Visio 提示Office 16 Click-to-Run Extensibility Component

今天在安装 Office Visio 2016 时&#xff0c;点击安装程序&#xff0c;出现以下错误&#xff1a; 出现这个问题的原因就是你的电脑以前安装过32位的office&#xff0c;卸载时&#xff0c;注册表没有清理干净。 解决方案&#xff1a; 在win10系统的左下搜索框内&#xff0c;输入…

加密安装Kli Linux

从U盘启动然后安装Kali是我们最喜欢并且是运行Kali最快(容易)的方法.为此,我们首先要把Kali的ISO克隆到U盘.如果你经常使用Kali Linux U盘,请在克隆前阅读完整的文档。 Kali Linux安装系列阅读&#xff1a; 用Live U盘安装Kali Linux http://www.linuxidc.com/Linux/2014-05/1…

hp服务器370G5硬盘列阵,hp DL380 g5创建raid阵列安装系统准备工作

RAID 1称为磁盘镜像&#xff0c;原理是把一个磁盘的数据镜像到另一个磁盘上&#xff0c;也就是说数据在写入一块磁盘的同时&#xff0c;会在另一块闲置的磁盘上生成镜像文件&#xff0c;在不影响性能情况下最大限度的保证系统的可靠性和可修复性上&#xff0c;只要系统中任何一…

服务器设备性能说明,OMC服务器硬件性能和配置说明.doc

OMC服务器硬件性能和配置说明PAGEOMC服务器硬件性能和配置说明TIME \ "yyyy年M月" \* MERGEFORMAT 2011年1月 PAGE 5目 录 TOC \t "Heading 1,1,Heading 2,2,Heading 3,4,Heading2 No Number,2,Heading3 No Number,3,About This Chapter,3,Subtitle,2" 第1…

编译错误syntax error : missing ';' before 'type'原因探寻

在VC6中运行以下代码 //main.c #include <stdio.h> int main() { chara[100]; memset(&a, 0, 100); charb; return 0; } / 编译器将会报一个编译错误&#xff0c; syntax error : missing ; before type 这个错误出在 char b; 这一行。 然后将程序改为 //…

谷歌guava_Google Guava BiMaps

谷歌guava接下来的番石榴之旅是另一个有用的收藏类型BiMap 。 实际上&#xff0c;这非常简单&#xff0c;BiMap只是双向地图。 反转地图 普通的Java映射是一组键和值&#xff0c;您可以按键查找值&#xff0c;这非常有用&#xff0c;例如&#xff0c;说我想创建一个&#xff0…

outlook设置263邮件服务器,大神详解win10系统怎么在Outlook中添加263邮箱的详细教程...

win10系统有很多人都喜欢使用,我们操作的过程中常常会碰到对win10系统怎么在Outlook中添加263邮箱的设置方法&#xff0c;想必大家都遇到过需要对win10系统怎么在Outlook中添加263邮箱进行设置的情况吧&#xff0c;那么应该怎么设置win10系统怎么在Outlook中添加263邮箱究竟该怎…

使用DynamoDB映射器将DynamoDB项目映射到对象

以前&#xff0c;我们使用Java创建了DynamoDB表。 对于各种数据库&#xff08;例如sql数据库或nosql&#xff09;&#xff0c;有一组工具可帮助访问&#xff0c;持久化和管理对象/类与基础数据库之间的数据。 例如&#xff0c;对于SQL数据库&#xff0c;我们使用JPA&#xff0…