Guava之ListenableFuture(实现Java异步)
2016-03-28 11:48
274 查看
*还记得我之前转载的一篇文章吗?
/article/7874735.html
但是这个实现的异步不是不能实现复杂的链式回调。*
get方法会堵塞,如果要用到这个结果,还是需要堵塞当前线程。
/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()设置回调函数。
相关文章推荐
- JAVA中几种集合(List、Set和Map)的区别
- java调用jython报ImportError: No module named...错误解决方法
- java线程知识总结
- 关于 java.lang.NoSuchMethodError: antlr.collections.AST.getLine()的解决方法
- zookeeper之系列一:出场和它的组成
- java浮点型比较大小
- JAVA基础-- 对象转型 (casting)
- JavaWeb项目开发案例精粹-第6章报价管理系统-07View层
- 100天JAVA学习计划01-HelloJAVA
- java动态代理(JDK和cglib)
- 谷歌宣布Android Studio将取代Eclipse
- MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql
- JavaWeb项目开发案例精粹-第6章报价管理系统-06po层
- spring配置datasource三种方式
- JavaWeb项目开发案例精粹-第6章报价管理系统-05Action层
- [疯狂Java]UDP:接收发送数据报、获取接收到的数据报的相关信息
- 一不小心就报了 java.lang.UnsatisfiedLinkError: No implementation found for long 怎么解决
- java中的参数传递——值传递、引用传递
- [java] JVM监控与调优
- 【Java基础】Jar包结构结构分析和操作具体解释