java Future && Guava Future
### java future
Runnable的任务是没有返回值,也不能抛出异常的
java.util.concurrent.Callable接口,可以返回一个对象或者抛出异常
使用jdk的这种方式提交Callble任务,如果使用Future等待返回结果,这里就是阻塞的。所以,可能某一个任务时间很长会拖累整个主任务的执行。
public class TestFuture {
final static ExecutorService executorService = Executors.newCachedThreadPool();
public static void main(String[] args) {
Future<Boolean> booleanTask = executorService.submit(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
return true;
}
});
while (true) {
if (booleanTask.isDone() && !booleanTask.isCancelled()) {
try {
TimeUnit.SECONDS.sleep(5);
Boolean result = booleanTask.get();
System.out.println("BooleanTask : " + result);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
if (booleanTask.isDone() && !booleanTask.isCancelled()) {
try {
Boolean result = booleanTask.get();
System.out.println("BooleanTask : " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(booleanTask.isCancelled());
System.out.println("BooleanTask is over");
Future<String> stringTask = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "Hello world";
}
});
/**
cancel只能取消还没有提交或者执行的线程任务,所以这里无法确定是否成功取消了submit的callab le任务,stringTask.isCancelled()的值也就是不确定的
**/
stringTask.cancel(true);
while (true) {
if (stringTask.isDone() && !stringTask.isCancelled()) {
try {
TimeUnit.SECONDS.sleep(5);
String result = stringTask.get();
System.out.println("StringTask : " + result);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
System.out.println("StringTask is over");
System.out.println(stringTask.isDone());
System.out.println(stringTask.isCancelled());
}
}
###代码片段
List<Future<Integer>> futures = Lists.newArrayList();
for (final AuditTask task : taskList) {
futures.add(ThreadUtils.CUSTOM_THREAD_EXECUTOR.submit(new Callable<Integer>() { @Override
public Integer call() throws Exception {
try {
sendToAkaOperation(task);
return COUNT_ONE;
} catch (Exception e) {
return COUNT_ZERO;
}
}
}));
} int count = 0;
for (Future<Integer> future : futures) {
try {
//阻塞,可能由于某个任务的执行影响整个主任务
count = count + future.get();
} catch (Exception e) {
log.error("一次推送auditPageDataWide到AKA任务异常:" + e.getMessage());
}
}
log.info("一次送审任务结束,本次送审任务完成送审AKA物料数目: " + count);
}
### guava future
ListenableFuture是可以监听的Future,如果任务完成或者失败可以自动回调函数。这样多个任务可以异步执行,并且可以实现无阻塞的获取每个任务的执行结果。
public class TestListenableFuture {
final static ListeningExecutorService LISTENING_EXECUTOR_SERVICE = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
public static void main(String[] args) {
ListenableFuture<Boolean> booleanTask = LISTENING_EXECUTOR_SERVICE.submit(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
TimeUnit.SECONDS.sleep(5);
return true;
}
});
Futures.addCallback(booleanTask, new FutureCallback<Boolean>() {
@Override
public void onSuccess( Boolean aBoolean) {
System.out.println("BooleanTask : " + aBoolean);
}
@Override
public void onFailure(Throwable throwable) {
}
});
ListenableFuture<String> stringTask = LISTENING_EXECUTOR_SERVICE.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "Hello world";
}
});
Futures.addCallback(stringTask, new FutureCallback<String>() {
@Override
public void onSuccess(String aBoolean) {
System.out.println(Thread.currentThread().getName());
System.out.println("StringTask : " + aBoolean);
}
@Override
public void onFailure(Throwable throwable) {
}
});
}
}
输出结果:
main
StringTask : Hello world
BooleanTask : true
java Future && Guava Future的更多相关文章
- Future 异步回调 大起底之 Java Future 与 Guava Future
目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...
- Guava future
减少主函数的等待时间,使得多任务能够异步非阻塞执行 ListenableFuture是可以监听的Future,它是对java原生Future的扩展增强.Future表示一个异步计算任务,当任务完成时可 ...
- Java异步调用Future对象
Future类存在于JDK的concurrent包中,主要用途是接收Java的异步线程计算返回的结果. 个人理解的使用场景大概如下: 有两个任务A和B,A任务中仅仅需要使用B任务计算成果,有两种方法实 ...
- 14.Java中的Future模式
jdk1.7.0_79 本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了Future ...
- Java中设置方法执行的超时时间java.util.concurrent.Future
java.util.concurrent.Future Future代表一个异步计算的结果.它提供了方法来检查是否计算已经完成,还是正在计算而处于等待状态,并且也提供了获取计算结果 方法.当计算完成后 ...
- Java中的Future相关
先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...
- java中 immutable,future,nio
什么是Future? 用过Java并发包的朋友或许对Future (interface) 已经比较熟悉了,其实Future 本身是一种被广泛运用的并发设计模式,可在很大程度上简化需要数据流同步的并发应 ...
- Java Callable和Future简述
创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果.如果需要获取执行结果,就必须通过共享变量或者使用线程 ...
- java.util.concurrent.Future Basics
Hereby I am starting a series of articles about future concept in programming languages (also known ...
随机推荐
- SDUTOJ 2498 数据结构实验之图论十一:AOE网上的关键路径
题目链接:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2498.html 题目大意 略. 分析 ...
- 剑指offer——71扑克牌中的顺子
题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决 ...
- 将本地已有的一个项目上传到新建的git仓库的方法
将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...
- 基础补充(四)——流程控制之if、while、for,break与continue
流程控制 一.流程控制之if……else…… if 条件1: 缩进的代码块 elif 条件2: 缩进的代码块 elif 条件3: 缩进的代码块 ...... else: 缩进的代码块 二.流程控制之 ...
- Apache POI环境设置
本章将指导完成Apache POI在Windows和Linux系统为基础的设置过程. Apache POI可以轻松地安装和集成,下面没有任何复杂的设置过程,通过几个简单步骤,目前Java环境,用户管理 ...
- org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.abc.beans.Minister
使用mybatis进行一对多嵌套查询时出错,错误原因: <select id="findMinisterById" resultMap="com.abc.beans ...
- 服务器搭建node环境
最近由于工作原因开始学习服务器的搭建和环境配置.记录一下我在服务器搭建node环境的步骤.中间踩了很多坑. 首先,确定自己的服务器可以连接到外网,如果连接不上的话,会出现ETIMEOUT的报错,但这只 ...
- 第十八天:CSV、JSON、Excel、SQLite
一.CSV文件 1.读取 reader = csv.reader(打开的file对象), reader为可迭代对象 2.用namedtuple映射列名 with open('apple.csv') a ...
- 数据可视化echart
刚接到这个一脸懵逼,到现在还算有点眉目,先上个图庆祝一下,哈哈,开心.... 最近没时间,等待更新..........
- Yacc - 一个生成 LALR(1) 文法分析器的程序
SYNOPSIS 总览 yacc [ -dlrtv ] [ -b file_prefix ] [ -p symbol_prefix ] filename DESCRIPTION 描述 Yacc 从 f ...