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 ...
随机推荐
- try-with-resources 让java资源关闭代码更简洁
一.JDK7的资源关闭方式优化 1 try-with-resource语法 在JDK7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resource语法,才实现了 ...
- python :Django url /views /Template 文件介绍
1,Django URL 路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django ...
- leetcode.字符串.242有效的字母异位词-Java
1. 具体题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注:判断两个字符串包含的字母是否完全一样. 示例 1: 输入: s = "anagram&q ...
- 二维RMQ hdu 2888
题目:点这里 题意:给出一个n*m的矩阵,然后又Q个询问:每个询问有x1,y1,x2,y2,x1,y1为子矩阵的左上角坐标,x2,y2为右上角的坐标.求此子矩阵中元素最大值,判断最大值是否在子矩阵四个 ...
- tf-idf 词条权重计算
在文本分类问题中,某些高频词一直出现,这样的词对区分文档的作用不大,例如: D1: 'Job was the chairman of Apple Inc.' D2: 'I like to use ...
- JUC 一 ReentrantLock 可重入锁
java.util.concurrent.locks ReentrantLock即可重入锁,实现了Lock和Serializable接口 ReentrantLock和synchronized都是可重入 ...
- BOM——特效
特效 偏移量 offsetParent用于获取定位的父级元素 offsetParent和parentNode的区别 var box = document.getElementById('box'); ...
- Go Hello World 实例
## Go Hello World 实例 package main import "fmt" func main() { /* This is my first sample pr ...
- bzoj1015题解
[题意分析] 给你一张无向图,要求支持删点和询问连通块数. [解题思路] 可以直接可持久化并查集大力艹过去. 考虑到正着删点就是倒着加点,所以并不需要可持久化.复杂度O((k+m)α(n)). [参考 ...
- 01二维背包——poj2576
/* 要求把a数组分成两个集合,两个集合人数最多差1,并且元素之和的差尽可能小 那只要把所有可行的列出来即可 01二维背包,即体积是个二维数据,那么我们的背包状态也应该设为二维 dp[j][k]设为 ...