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 ...
随机推荐
- centos安装vbox addition
在centos下安装vbox addition需要下载当前内核的头文件 yum install kernel-devel 但是下载了头文件后,仍然失败,原来是下载的头文件与当前的内核版本不对应, 于是 ...
- BigDecimal.divide方法
java.math.BigDecimal.divide(BigDecimal divisor, int roundingMode) 返回一个BigDecimal,其值为(this/除数),其标度是th ...
- 深入浅出原生JS:One
Arguments 对象: 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. 例如,在函数 sayHi() 中,第一个参数是 message.用 argumen ...
- zookeeper 同一docker伪集群
1).集群目录 cd /usr/local/zookeeper01/data touch myid vi 输入 cd /usr/local/zookeeper01/data touch myid v ...
- 记录一次工作中jvm被linux杀死的调查
首先,以后碰到任何jvm的错误,先看日志!!!!!!!! web项目在tomcat目录下的log里,或者自己设定的errorfile目录下.总之,找到一切可以运用的日志,比如crash日志,cored ...
- C# 消息队列 多线程 委托
发消息 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
- jq-demo-点击改变图片
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 27 string类中常用的方法列表
1. 获取方法 int length() 获取字符串的长度 char charAt(int index) 获取特定位置的字符 (角标越界) int indexOf(String str) 获取 ...
- 简单介绍下怎么在spring中使用RabbitMQ
这篇文章主要介绍了简单了解如何在spring中使用RabbitMQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 常见的消息中间件产品: (1)Ac ...
- Andriod Unity 调用android函数
//首先这是一个前沿 //我看了多的资料,还看了近半个小时的 android activity 的讲解 终于打出了apk //接下来开始 //一步一步的跟着我走 1.创建一个android项目或者一个 ...