原文:http://www.cnblogs.com/whitewolf/p/4113860.html

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&lt;Object&gt;() {

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

    public void onFailure(Throwable thrown) {
        System.out.printf(&quot;onFailure %s%n&quot;, 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&lt;Integer&gt;() {
        public Integer call() throws InterruptedException {
            Thread.sleep(1000);
            System.out.println(&quot;call future 1.&quot;);
            return 1;
        }
    });

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

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

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

    Futures.addCallback(transform, new FutureCallback&lt;Object&gt;() {

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

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

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

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

spring boot 使用spring.profiles.active来分区配置

原文地址:http://www.leftso.com/blog/111.html 很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般...

阅读全文

Linux下mysql中文乱码问题

安装完的MySQL的默认字符集为 latin1 ,为了要将其字符集改为用户所需要的(比如utf8),就必须改其相关的配置文件;由于linux下MySQL的默认安装目录分布在不同...

阅读全文

mongodb

MongoDB介绍 MongoDB是由C++语言编写的分布式存储数据库,旨在为Web应用提供可扩展的高性能数据存储解决方案。是一个介于关系数据库和非关系数据库之间的...

阅读全文

欢迎留言