*还记得我之前转载的一篇文章吗?
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();
}
}