Guava之ListenableFuture(实现Java异步)

来源:互联网 发布:mysql 查询死锁语句 编辑:程序博客网 时间:2024/04/30 02:47

*还记得我之前转载的一篇文章吗?
http://blog.csdn.net/u011499747/article/details/50725131
但是这个实现的异步不是不能实现复杂的链式回调。*

0.回顾jdk自带的future

实验代码:

package com.dubby.guava.future;import java.util.concurrent.*;/** * Created by dubby on 16/3/28. */public class JDKFuture {    public static void main(String[] args) throws Exception{        ExecutorService pool = Executors.newFixedThreadPool(3);        Future<String> future = pool.submit(new Callable<String>() {            public String call() throws Exception {                try {                    Thread.sleep(1000);                } catch (Exception e){                    e.printStackTrace();                }                return "JDK Normal future result";            }        });        String result = future.get();        System.out.println(result);        pool.shutdown();    }}

get方法会堵塞,如果要用到这个结果,还是需要堵塞当前线程。

1.guava的ListenableFuture

实验代码:

package com.dubby.guava.future;import com.google.common.util.concurrent.*;import java.util.concurrent.Callable;import java.util.concurrent.CountDownLatch;import java.util.concurrent.Executors;/** * Created by dubby on 16/3/28. */public class ListenerFutureDemo {    public static void main(String[] args) {        final CountDownLatch latch = new CountDownLatch(1);        ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(3));        ListenableFuture<String> listenableFuture = pool.submit(new Callable<String>() {            public String call() throws Exception {                try{                    Thread.sleep(1000);                } catch (Exception e){                    e.printStackTrace();                }                return "Guava Listening future result";            }        });        Futures.addCallback(listenableFuture, new FutureCallback<String>() {            public void onSuccess(String s) {                latch.countDown();                System.out.println(s);            }            public void onFailure(Throwable throwable) {                System.out.println(throwable.getMessage());            }        });        try {            latch.await();        } catch (InterruptedException e) {            e.printStackTrace();        }        pool.shutdown();    }}

2.代码解释

2.1 装饰者模式获得ListeningExecutorService。

2.2 ListenableFuture listenableFuture = pool.submit()获得ListenableFuture。

2.3 Futures.addCallback()设置回调函数。

1 0
原创粉丝点击