### 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的更多相关文章

  1. Future 异步回调 大起底之 Java Future 与 Guava Future

    目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...

  2. Guava future

    减少主函数的等待时间,使得多任务能够异步非阻塞执行 ListenableFuture是可以监听的Future,它是对java原生Future的扩展增强.Future表示一个异步计算任务,当任务完成时可 ...

  3. Java异步调用Future对象

    Future类存在于JDK的concurrent包中,主要用途是接收Java的异步线程计算返回的结果. 个人理解的使用场景大概如下: 有两个任务A和B,A任务中仅仅需要使用B任务计算成果,有两种方法实 ...

  4. 14.Java中的Future模式

    jdk1.7.0_79  本文实际上是对上文<13.ThreadPoolExecutor线程池之submit方法>的一个延续或者一个补充.在上文中提到的submit方法里出现了Future ...

  5. Java中设置方法执行的超时时间java.util.concurrent.Future

    java.util.concurrent.Future Future代表一个异步计算的结果.它提供了方法来检查是否计算已经完成,还是正在计算而处于等待状态,并且也提供了获取计算结果 方法.当计算完成后 ...

  6. Java中的Future相关

    先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...

  7. java中 immutable,future,nio

    什么是Future? 用过Java并发包的朋友或许对Future (interface) 已经比较熟悉了,其实Future 本身是一种被广泛运用的并发设计模式,可在很大程度上简化需要数据流同步的并发应 ...

  8. Java Callable和Future简述

    创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果.如果需要获取执行结果,就必须通过共享变量或者使用线程 ...

  9. java.util.concurrent.Future Basics

    Hereby I am starting a series of articles about future concept in programming languages (also known ...

随机推荐

  1. centos安装vbox addition

    在centos下安装vbox addition需要下载当前内核的头文件 yum install kernel-devel 但是下载了头文件后,仍然失败,原来是下载的头文件与当前的内核版本不对应, 于是 ...

  2. BigDecimal.divide方法

    java.math.BigDecimal.divide(BigDecimal divisor, int roundingMode) 返回一个BigDecimal,其值为(this/除数),其标度是th ...

  3. 深入浅出原生JS:One

    Arguments 对象: 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. 例如,在函数 sayHi() 中,第一个参数是 message.用 argumen ...

  4. zookeeper 同一docker伪集群

    1).集群目录 cd /usr/local/zookeeper01/data touch myid vi  输入 cd /usr/local/zookeeper01/data touch myid v ...

  5. 记录一次工作中jvm被linux杀死的调查

    首先,以后碰到任何jvm的错误,先看日志!!!!!!!! web项目在tomcat目录下的log里,或者自己设定的errorfile目录下.总之,找到一切可以运用的日志,比如crash日志,cored ...

  6. C# 消息队列 多线程 委托

    发消息 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  7. jq-demo-点击改变图片

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 27 string类中常用的方法列表

    1. 获取方法 int length()     获取字符串的长度 char charAt(int index) 获取特定位置的字符 (角标越界) int indexOf(String str) 获取 ...

  9. 简单介绍下怎么在spring中使用RabbitMQ

    这篇文章主要介绍了简单了解如何在spring中使用RabbitMQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 常见的消息中间件产品: (1)Ac ...

  10. Andriod Unity 调用android函数

    //首先这是一个前沿 //我看了多的资料,还看了近半个小时的 android activity 的讲解 终于打出了apk //接下来开始 //一步一步的跟着我走 1.创建一个android项目或者一个 ...