guava 并发_Google Guava并发– ListenableFuture

guava 并发

在上一篇文章中,我介绍了使用Guava库中com.google.common.util.concurrent包中的Monitor类的方法。 在这篇文章中,我将继续介绍Guava并发实用程序,并讨论ListenableFuture接口。 ListenableFuture通过添加接受完成侦听器的方法,从java.util.concurrent包扩展了Future接口。

可听的未来

ListenableFuture行为与java.util.concurrent.Future完全相同,但是具有方法addCallback(Runnable, ExecutorService)在给定的executor中执行回调。 这是一个例子:

ListenableFuture futureTask = executorService.submit(callableTask)futureTask.addListener(new Runnable() {@Overridepublic void run() {..work after futureTask completed}}, executorService);

如果在添加回调时提交的任务已完成,它将立即运行。 使用addCallback方法有一个缺点,即Runnable无法访问future产生的结果。 要访问Future的结果,您将需要使用FutureCallback

FutureCallback

FutureCallback接受从Future产生的结果,并指定onSuccessonFailure方法。 这是一个例子:

class FutureCallbackImpl implements FutureCallback<String> {@Overridepublic void onSuccess(String result){.. work with result}@Overridepublic void onFailure(Throwable t) {... handle exception}}

通过使用Futures类中的addCallback方法来附加FutureCallback

Futures.addCallback(futureTask, futureCallbackImpl);

此时,您可能会问,当ExecutorService仅返回Futures时,如何获取ListenableFuture实例? 答案是使用ListenableExecutionService

ListenableExecutionService

要使用ListenableExecutionService只需使用对MoreExecutors.listeningDecorator(ExecutorService)的调用来装饰ExecutorService实例,例如:

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

结论

借助添加回调(无论是Runnable还是处理成功和失败条件的FutureCallback功能, ListenableFuture可能是对您的武器库的宝贵补充。 我创建了一个单元测试使用证明ListenableFuture可以作为一个依据 。 在我的下一个职位,我要覆盖Futures类,它包含与工作静态方法futures

资源资源

  • 番石榴项目首页
  • ListenableFuture API
  • 样例代码


参考: Google Guava并发–来自我们的JCG合作伙伴 Bill Bejeck的《可编码的随机思考》博客中的ListenableFuture。

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

guava 并发

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

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

相关文章

mysql 递归_「MySQL」 - SQL Cheat Sheet - 未完成

近几个月的心情真是安排的妥妥的&#xff0c;呈现W状。多的不说了&#xff0c;这里对SQL的测试进行简单梳理&#xff0c;制作一份SQL Cheat Sheet。0x01、数据库基本架构Clinet层Server层连接器网络连接建立、管理长连接导致的OOM的自动处理权限管理缓存KV分析器词法分析语法分…

ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别

前记&#xff1a; jdk官方文档&#xff08;javadoc&#xff09;是学习的最好&#xff0c;最权威的参考。文章分上中下。上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别&#xff0c;池大小参数corePoolSize和maximumPoolSize&#xff0c;BlockingQueue选…

Apache Lucene 7.0即将发布!

Apache Lucene项目可能会在几个月后发布其下一个主要版本7.0&#xff01; 请记住&#xff0c;Lucene开发人员通常会努力为下一个非主要&#xff08;功能&#xff09;发行版移植新功能&#xff0c;而即将发布的6.5已经有了很多重大更改 &#xff0c;因此新的主要发行版令人兴奋…

windows常用服务命令

windows运行打开服务命令的方法 &#xff1a;在开始-》运行&#xff0c;输入以下命令 gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff---------注销命令 tsshutdn-------60秒倒计时关机命令 explorer--…

springmvc 配置 tag lib_Java自学之springMVC:Hello Spring MVC

学习目的&#xff1a;初识SpringMVC&#xff0c;了解SpringMVC的工作原理Part 1新建一个动态web项目&#xff0c;命名为springMVC&#xff0c;在WEB-INF/lib中&#xff0c;添加所需要的jar包。Part 2在WEB-INF下新建一个web.xml。配置一个DispatcherServlet&#xff0c;所有的请…

GoogLeNet

GoogLeNetInception结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。对上图做以下说明&#xff1a; 1 . 采用不同大小的卷积核意味着不同大小的感受野&#xff0c;最后拼接意味着不同尺度特征的融合&#xff1b; 2 . 之所以卷积核大小采用1、3和5&#xff0c;主要是为…

1. ThreadPoolExecutor的一个常用的构造方法

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) 参数说明&#xff1a; -corePoolSize       线程池中所保存的核心线程数。线程池启动后默…

spring boot 启动卡住_SpringBoot集成的44种启动器,你知道几种?

点击蓝字“程序员考拉”欢迎关注&#xff01;啥是应用启动器&#xff1f;SpringBoot集成了spring的很多模块&#xff0c;比如tomcat、redis等等。你用SpringBoot搭建项目&#xff0c;只需要在pom.xml引入相关的依赖&#xff0c;和在配置文件中简单的配置就可以使用相应模块了。…

junit 经典示例_JUnit4参数化和理论示例

junit 经典示例我始终依靠TestNG将参数传递给测试方法&#xff0c;以便为我的测试或套件提供一些灵活性。 但是&#xff0c;使用JUnit4可以实现相同的灵活性。 要使用它很简单&#xff1a; package com.marco.test;import java.util.Arrays;import java.util.Collection;imp…

Spring+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务

一、概念 分布式事务 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简言之&#xff0c;同时操作多个数据库保持事务的统一&#xff0c;达到跨库事务的效果。 JTA JTA&#xff0c;即Java Transaction API&a…

spring el表达式 if else_Spring 获取单例流程(二)

读完这篇文章你将会收获到Spring 中 prototype 类型的 bean 如何做循环依赖检测Spring 中 singleton 类型的 bean 如何做循环依赖检测前言继上一篇文章 Spring 获取单例流程(一) 我们这次继续往下分析一下后面的流程上一篇文章中我们说到&#xff0c;首先我们根据 name 找到其对…

Apache Spark RDD和Java流

几个月前&#xff0c;我很幸运地参加了一些使用Apache Spark的PoC&#xff08;概念验证&#xff09;。 在这里&#xff0c;我有机会使用弹性分布式数据集&#xff08;简称RDD &#xff09;&#xff0c;转换和操作。 几天后&#xff0c;我意识到虽然Apache Spark和JDK是非常不同…

用脚本js把结果转化为固定小数位的形式

function roundTo(base,precision) {var mMath.pow(10,precision);var aMath.round(base * m) / m;return a; } 例如&#xff1a;给定数字n6.3241712&#xff0c;则用roundTo&#xff08;n,0&#xff09;得4&#xff0c;用roundTo(n,7)得到6.3241712转载于:https://www.cnblogs…

存储过程详解

什么是存储过程&#xff1a;存储过程可以说是一个记录集吧&#xff0c;它是由一些T-SQL语句组成的代码块&#xff0c;这些T-SQL语句代码像一个方法一样实现一些功能&#xff08;对单表或多表的增删改查&#xff09;&#xff0c;然后再给这个代码块取一个名字&#xff0c;在用到…

gpu版tensorflow测试

测试程序&#xff1a; import tensorflow as tfwith tf.Session(configtf.ConfigProto(allow_soft_placementTrue, log_device_placementFalse)) as sess:a tf.constant(1)b tf.constant(3)c a bprint(结果是&#xff1a;%d\n 值为&#xff1a;%d % (sess.run(c), sess.ru…

随机森林原理_机器学习(29):随机森林调参实战(信用卡欺诈预测)

点击“机器学习研习社”&#xff0c;“置顶”公众号重磅干货&#xff0c;第一时间送达回复【大礼包】送你机器学习资料与笔记回顾推荐收藏>机器学习文章集合&#xff1a;1-20机器学习(21): Tensorflow Keras手写数字识别机器学习(22): Tensorflow Keras识别猫狗机器学习(23)…

sudo 命令报错的解决方法

尝试着用终端打开Mac的安全权限&#xff08;sudo spctl --master-disable&#xff09;&#xff0c;却显示以下提示&#xff0c;望高手解答。sudo: /etc/sudoers is world writablesudo: no valid sudoers sources found, quittingsudo: unable to initialize policy plugin 解决…

BGR转RGB

原图&#xff1a; 源代码&#xff1a; #codingutf-8#OpenCV读进来的图像,通道顺序为BGR&#xff0c; 而matplotlib的顺序为RGB&#xff0c;因此需要转换 import cv2 import numpy as np from matplotlib import pyplot as pltimg cv2.imread(./test1.jpg) B, G, R cv2.split…

C++ set的一些用法

set也是STL中比较常见的容器。set集合容器实现了红黑树的平衡二叉检索树的数据结构&#xff0c;它会自动调整二叉树的排列&#xff0c;把元素放到适当的位置。set容器所包含的元素的值是唯一的&#xff0c;集合中的元素按一定的顺序排列。 我们构造set集合的目的是为了快速的检…

ide在控制台输入编译命令_快速编译调试 Redis

一&#xff1a;开篇Redis 它是个宝&#xff0c;男女老少都说好。秒杀限流分布式&#xff0c;什么需求都能搞。Redis 主要的用途是分布式缓存&#xff0c;其实不用我多介绍&#xff0c;相信大家都用过Redis。之前也看过不少Redis的书&#xff0c;其中就包括《Redis设计与实现》。…