Guava 并行 Futures实例
Future可以用来构建复杂的异步操作,方法不是返回一个值,而是一个Future对象。创建Future对象的过程(比如调用Future异步函数接口),不会阻塞当前线程操作,而且对象第一个次创建没有值,但以后可以通过这个对象获取这个值。Guava中的ListenableFuture接口对java.util.concurrent.Future接口做了进一步拓展,并且提供了Futures静态工具类,大大方便了我们的使用。本文主要介绍Guava Future的使用,给出了几个使用的例子。

Code Test Case
多任务并发执行,不阻塞当前线程
@Test
public void should_run_future_tasks_in_parallel() throws Exception {
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture<?> task1 = service.submit(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
System.out.println("future task1 done.....");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
ListenableFuture<?> task2 = service.submit(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
System.out.println("future task2 done.....");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
System.out.println("main task done.....");
Thread.sleep(3000);
}
可以使用get操作获取Future值,阻塞当前线程,直到异步操作逻辑处理完毕
@Test
public void should_block_the_current_thread() throws Exception {
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture<Integer> task = service.submit(new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(2000);
System.out.println("future task done......");
return 1;
}
});
System.out.println(task.get());
System.out.println("main task done.....");
}
get函数提供下面两个接口,用户可以根据需要选择是否添加超时。
V get() throws InterruptedException, ExecutionException;
V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
处理异步Future,可以使用callback,在callback函数中对异步处理的结果进行处理。callback函数不阻塞当前线程。
@Test
public void should_call_back_the_future_task() throws Exception {
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture<Integer> task = service.submit(new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(2000);
System.out.println("future task done......");
return 1;
}
});
Futures.addCallback(task, new FutureCallback() {
public void onSuccess(Object o) {
System.out.println("异步处理成功,result="+o);
}
public void onFailure(Throwable throwable) {
System.out.println("异步处理失败,e="+throwable);
}
});
System.out.println("main task done.....");
Thread.sleep(3000);
}
例子中使用的Futures.addCallBack函数,第一个参数为我们要处理的异步Future task,它可以是一个数据库处理,可以是一个外部模块API请求等;第二个参数我们使用的是FutureCallBack匿名构造对象,对象内实现两个方法,onSuccess和onFailure。future task处理成功,没有任何异常则分支进入onSuccess处理,否则进入onFailure分支。
将Future对象转化为另一个Future对象
例子中将task的结果转化为Boolean类型的future对象
@Test
public void should_transform_to_another_future_obj() throws Exception {
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture<Integer> task = service.submit(new Callable<Integer>() {
public Integer call() throws Exception {
Thread.sleep(2000);
System.out.println("future task done......");
return 1;
}
});
ListenableFuture<Boolean> transform = Futures.transform(task, new AsyncFunction<Integer, Boolean>() {
public ListenableFuture<Boolean> apply(Integer integer) throws Exception {
return integer > 0 ? Futures.immediateFuture(Boolean.TRUE):
Futures.immediateFuture(Boolean.FALSE);
}
});
System.out.println(transform.get());
Thread.sleep(3000);
}
创建一个Future带值对象(非null)可以使用下面的接口
public static <V> ListenableFuture<V> immediateFuture(@Nullable V value) {
Conclusion
Future在异步处理方面具有强大的功能,在分布式系统中组件异步通信,具有很好的应用。本文给出了Guava Future使用的几个实例,希望能对大家有所帮助。
更多ListenableFuture接口可以参考官方API文档:
< https://github.com/google/guava/wiki/ListenableFutureExplained >
Guava 并行 Futures实例的更多相关文章
- Guava - 并行编程Futures
Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展. 继承至Future的ListenableFuture,允许我 ...
- Slickflow.NET 开源工作流引擎基础介绍(七) -- 并行分支多实例模式实现
前言:并行审批是比较常见的流程模式,在工作流模式介绍中,通常是多个分支通过网关(Gateway)来控制实现.默认的分支类型是静态定义好的.本文扩展了并行网关的控制方式,实现了动态多实例的并行分支网关, ...
- Guava - EventBus(事件总线)
Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计 ...
- Future 异步回调 大起底之 Java Future 与 Guava Future
目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...
- [Java 缓存] Java Cache之 Guava Cache的简单应用.
前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. 一: 什么是Guava Guava工程包含了若干被Google的 Java项 ...
- C#并行Parallel编程模型实战技巧手册
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...
- Activiti学习之 多实例实现会签功
转: Activiti学习之 多实例实现会签功能 2014年11月26日 11:27:11 程诺 阅读数:26185 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...
- Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合
前言: 流程引擎的核心功能是负责解析流程定义XML和流转,业务环节的不断积累,让人们不断总结和抽象出一些模式,这些模式统称为工作流模式(Workflow Pattern).本文的重点就是介绍一种常见 ...
- 教你管理SQL实例系列(1-15)
全系列转自:51CTO ->jimshu http://jimshu.blog.51cto.com 目录及原本连接如下: 教你管理SQL实例(1)数据库实例 教你管理SQL实例(2)服务启动帐户 ...
随机推荐
- 基于AWS的云服务架构最佳实践
ZZ from: http://blog.csdn.net/wireless_com/article/details/43305701 近年来,对于打造高度可扩展的应用程序,软件架构师们挖掘了若干相关 ...
- 写了一个基于React+Redux的仿Github进度条
曾经实现过Angular版,这次感觉用了高大上的React却写了更多的代码,需要的配置也更多了,有利有弊吧. 但这个“导航条问题”很有意思,涉及到在Redux中写timer,其实我很困惑,到底如何完美 ...
- BZOJ1742[Usaco2005 nov]Grazing on the Run
Description John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可 以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋, ...
- springboot使用之三:springboot使用logback日志
springboot 默认使用的日志就是logback,所以使用logback不需要添加日志相关依赖了,执行 添加logback.xml配置文件,springboot这个聪明的框架便能识处理你的配置. ...
- 使用git svn clone迁移svn仓库
使用git svn clone迁移svn仓库 clone命令可以指定很多参数,主要用到这些,你也可以使用git svn help查看完整的参数列表. git svn clone https://172 ...
- (转)Linux下root密码丢失和运行级别错误的解决办法
我们知道,root用户在Linux中是相当重要的,其地位如同Windows中的Adminstrator 有了root权限我们还能修改其他用户的密码,可是,如果root用户的密码丢失该怎么办? 不用担心 ...
- invalidate()和postInvalidate()的使用与区别
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型: Android UI操作并不是线程安全的,并且这些操作必须在UI线程 ...
- Ubuntu下不重装系统安装SSD总结
一.要想给自己的机子装个固态,但又不想重装系统,各种配置,那么就要先把自己的系统从HDD复制到SSD上,这里说下我的情况.我的HDD 是500G ubuntu系统,安装的时候没有分区,默认是dev/s ...
- MATLAB不运行也不报错
今天本来挺激动找到能运行的好几个程序 MATLAB忙到busy也是停不下来 本来不以为然 结果呢 吃了个水果 一杯水都喝下去了 还没结果(⊙o⊙) 这时候解决办法只有一个 Ctrl+c
- PL/SQL通过存储过程为相同数据添加序号
在Oracle数据库中存有一串数据(Ori_Seq),数据包含不等量重复: 为方便查看与管理,现希望添加一字段(New_Seq),在原有数据的末尾为其添加一串序号,相同数据序号从小到大排列,序号长度为 ...