您的位置:首页 > 编程语言 > Java开发

Guava之ListenableFuture(实现Java异步)

2016-03-28 11:48 274 查看
*还记得我之前转载的一篇文章吗?

/article/7874735.html

但是这个实现的异步不是不能实现复杂的链式回调。*

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()设置回调函数。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: