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

时间: 2024-09-12 13:15:10

Guava - 并行编程Futures的相关文章

Guava - 并行编程Futures详解_java

Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展. 继承至Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回. 对ListenableFuture添加回调函数: Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor) 其中 FutureCallbac

利用F#在Silverlight中实现并行编程

随着.NET 4的发布,要在.NET平台之上进行并行编程可谓是易如反掌.实际上,微软为大家提供了三种并行编程的基础功能.第一种是提供给C++使用的并发运行时 (Concurrency Runtime);第二种是藉由.NET平台提供给托管语言的一组并行编程函数库(包括TPL.PLINQ和并行编程数据结构等);最后一种就是基于F# 本身的并行编程特性. 然而,由于考虑精简的缘故,当前的CoreCLR并未包含.NET 4中的并行函数库,从而在Silverlight(即使最新的Silverlight 4

用Hadoop进行分布式并行编程, 第1部分

Hadoop 是一个实现了 MapReduce 计算模型的开源分布式并行编程框架,借助于 Hadoop, 程序员可以轻松地编写分布式并行程序,将其运行于计算机集群上,完成海量数 据的计算.本文将介绍 MapReduce 计算模型,分布式并行计算等基本概念,以及 Hadoop 的安装部署和基本运行方法. Hadoop 简介 Hadoop 是一个开源的可运行于大规模集群上的分布式并行编程框架,由于分布式存储 对于分布式编程来说是必不可少的,这个框架中还包含了一个分布式文件系统 HDFS( Hadoo

模式转变:并行编程方面的设计注意事项

本文以 Visual Studio 工具的预发布版为基础.文中的所有信息均有可能发生变更. 本文将介绍以下内容: 并行计算 并发编程 性能提高 本文使用了以下技术: 多线程 从 1986到 2002 年,微处理器的性能每年提高了 52%.这一惊人的技术进步源自晶体管成本依据摩尔 法则不断地缩减,以及处理器厂商在工程方面的出色表现.微软的研究员 Jim Larus 将上述两种因素的 组合称为"摩尔红利",他解释了这一红利如何造就了现代软件业并使计算机得以广泛普及(请参阅 go.micro

深入理解并行编程-锁

锁 在过去几十年并发研究领域的出版物中,锁总是扮演着坏人的角色,锁背负的指控包括引起死锁.锁封护(luyang注:lock convoying,多个同优先级的线程重复竞争同一把锁,此时大量虽然被唤醒而得不到锁的线程被迫进行调度切换,这种频繁的调度切换相当影响系统性能).饥饿.不公平.data races以及其他许多并发带来的罪孽.有趣的是,在共享内存并行软件中真正承担重担的是--你猜对了--锁. 图1.1:锁:坏人还是懒汉? 这种截然不同的看法源于下面几个原因: 1. 很多因锁产生的问题大都有实

《深入理解并行编程》中文版

原文的下载地址:http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html 中文版下载地址:深入理解并行编程V1.0 (4.1M) 本书是linux内核大牛paul的力作,和鲁阳同学一起,花了两个月时间进行翻译. 目前没有翻译问答部分,主要是时间不够,也担心不能将这部分翻译准确. 对内核深度发烧的同学可以看看. 本书目录 1. 简介----------------------------------- 14 1

并行编程中的内存回收Hazard Pointer

感谢同事[kevinlynx]在本站发表此文 接上篇使用RCU技术实现读写线程无锁,在没有GC机制的语言中,要实现Lock free的算法,就免不了要自己处理内存回收的问题. Hazard Pointer是另一种处理这个问题的算法,而且相比起来不但简单,功能也很强大.锁无关的数据结构与Hazard指针中讲得很好,Wikipedia Hazard pointer也描述得比较清楚,所以我这里就不讲那么细了. 一个简单的实现可以参考我的github haz_ptr.c   原理 基本原理无非也是读线程

C#并行编程-相关概念

原文:C#并行编程-相关概念 菜鸟初步学习,不对的地方请大神指教,参考<C#并行编程高级教程.pdf> 背景 当今计算机至少都有一颗双核的微处理器,带有四核.八核的计算机非常常见,在单个处理器上具有多个内核的时代正在来临,现代微处理器提供了新型的多核架构,因此软件设计和编码能够充分发挥这些架构的功能是非常重要的事情,也要与时俱进. 多核微处理器 多核微处理器有很多种不同的复杂微架构,意在提供更强的并行执行能力,提升吞吐量,减少潜在的性能瓶颈,缩减电源消耗,并减少发热量,因此,现代很多的微处理器

深入理解并行编程-分割和同步设计(二)

双端队列是一种元素可以从两端插入或删除的数据结构[Knu73].据说实现一种基于锁的允许在双端队列的两端进行并发操作的方法非常困难[Gro07].本节将展示一种分割设计策略,能实现合理且简单的解决方案,请看下面的小节中的三种通用方法. 1.1. 右手锁和左手锁 图1.1:带有左手锁和右手锁的双端队列 右手锁和左手锁是一种看起来很直接的办法,为左手端的入列操作加一个左手锁,为右手端的出列操 作加一个右手锁,如图1.1所示.但是,这种办法的问题是当队列中的元素不足四个时,两个锁的范围会发生重叠.这种