本文主要是介绍Guava之ListenableFuture(实现Java异步),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
*还记得我之前转载的一篇文章吗?
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()设置回调函数。
这篇关于Guava之ListenableFuture(实现Java异步)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!