当前位置: 首页 > news >正文

Guava - 并行编程Futures

Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展。

继承至Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回。

对ListenableFuture添加回调函数:

Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor)

其中 FutureCallback是一个包含onSuccess(V),onFailure(Throwable)的接口。

使用如:

Futures.addCallback(ListenableFuture, new FutureCallback<Object>() {

    public void onSuccess(Object result) {
        System.out.printf("onSuccess with: %s%n", result);
    }

    public void onFailure(Throwable thrown) {
        System.out.printf("onFailure %s%n", thrown.getMessage());
    }
});

同时Guava中Futures对于Future扩展还有:

  • transform:对于ListenableFuture的返回值进行转换。
  • allAsList:对多个ListenableFuture的合并,返回一个当所有Future成功时返回多个Future返回值组成的List对象。注:当其中一个Future失败或者取消的时候,将会进入失败或者取消。
  • successfulAsList:和allAsList相似,唯一差别是对于失败或取消的Future返回值用null代替。不会进入失败或者取消流程。
  • immediateFuture/immediateCancelledFuture: 立即返回一个待返回值的ListenableFuture。
  • makeChecked: 将ListenableFuture 转换成CheckedFuture。CheckedFuture 是一个ListenableFuture ,其中包含了多个版本的get 方法,方法声明抛出检查异常.这样使得创建一个在执行逻辑中可以抛出异常的Future更加容易
  • JdkFutureAdapters.listenInPoolThread(future): guava同时提供了将JDK Future转换为ListenableFuture的接口函数。

下边是一个对于Future的测试demo:

@Test
public void should_test_furture() throws Exception {
    ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));

    ListenableFuture future1 = service.submit(new Callable<Integer>() {
        public Integer call() throws InterruptedException {
            Thread.sleep(1000);
            System.out.println("call future 1.");
            return 1;
        }
    });

    ListenableFuture future2 = service.submit(new Callable<Integer>() {
        public Integer call() throws InterruptedException {
            Thread.sleep(1000);
            System.out.println("call future 2.");
    //       throw new RuntimeException("----call future 2.");
            return 2;
        }
    });

    final ListenableFuture allFutures = Futures.allAsList(future1, future2);

    final ListenableFuture transform = Futures.transform(allFutures, new AsyncFunction<List<Integer>, Boolean>() {
        @Override
        public ListenableFuture apply(List<Integer> results) throws Exception {
            return Futures.immediateFuture(String.format("success future:%d", results.size()));
        }
    });

    Futures.addCallback(transform, new FutureCallback<Object>() {

        public void onSuccess(Object result) {
            System.out.println(result.getClass());
            System.out.printf("success with: %s%n", result);
        }

        public void onFailure(Throwable thrown) {
            System.out.printf("onFailure%s%n", thrown.getMessage());
        }
    });

    System.out.println(transform.get());
}

官方资料主页:https://awk.so/@code.google.com!/p/guava-libraries/wiki/ListenableFutureExplained

更多Guava博文:

  1. Guava – 并行编程Futures
  2. Guava – EventBus(事件总线)


作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客、博客园--破狼和51CTO--破狼。http://www.cnblogs.com/whitewolf/p/4113860.html


相关文章:

  • Mybatis Generator逆向工程的使用
  • springMvc REST 请求和响应
  • 数字水印技术的研究现状与发展趋势
  • 简单登录系统
  • warning no match for this type name:xxx.xxx.xxx [Xlint:invalidAbsoluteTypeName]
  • 用UltraISO制作系统安装u盘
  • index merge的一次优化
  • python之下载每日必应壁纸
  • malloc与free函数用法
  • 通读现代软件工程之构建之法
  • Nagios 监控
  • Python使用UUID库生成唯一ID
  • MongoDB又不加密,8.09亿条个人详细记录泄露
  • jQuery模拟打字逐字输出代码
  • ES6语法(二) 函数
  • 时间复杂度分析经典问题——最大子序列和
  • [译]CSS 居中(Center)方法大合集
  • 77. Combinations
  • create-react-app项目添加less配置
  • ES6 ...操作符
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • GraphQL学习过程应该是这样的
  • isset在php5.6-和php7.0+的一些差异
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • spark本地环境的搭建到运行第一个spark程序
  • vue-router 实现分析
  • 基于axios的vue插件,让http请求更简单
  • 老板让我十分钟上手nx-admin
  • 聊聊flink的BlobWriter
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 悄悄地说一个bug
  • 如何使用 JavaScript 解析 URL
  • 正则学习笔记
  • ​渐进式Web应用PWA的未来
  • ###项目技术发展史
  • #DBA杂记1
  • (3)选择元素——(17)练习(Exercises)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (二)pulsar安装在独立的docker中,python测试
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (图)IntelliTrace Tools 跟踪云端程序
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net小白的大学四年,内含面经
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .ui文件相关
  • /etc/skel 目录作用
  • @Autowired多个相同类型bean装配问题
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [Ariticle] 厚黑之道 一 小狐狸听故事