### 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. C++——变量

    1.变量的初始化和赋值 初始化:创建变量时赋予一个初始值 赋值:把变量的当前值擦除,以新的值替代 2.变量的声明和定义 声明:名字为程序所知.如果一个程序要使用另一个程序的名字,则要包含对那个名字的声 ...

  2. 关于Unity中文件读取

    存储: 在程序发布后文件的存放有两种,第一种是打包到Uniyt的资源包中(*.unity3D),第二种就是把文件存放在一个特殊的目录如:StreamingAssets,这个目录的东西Unity不会打包 ...

  3. mysql优化1:建表原则

    建表三大原则: 定长和变长分离 常用字段和不常用字段分离 使用冗余字段或冗余表 1.定长与变长分离 如 id int,占4个字节,char(4)占4个字符长度,也是定长,time 即每一个单元值占的字 ...

  4. HXY烧情侣

    题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要 ...

  5. ES6解构

    解构:“解开--重构” 1.数组的解构: //数组的解构: // let arr=[1,2,3,6] // let[a,b,c,d]=arr; // console.log(a,b,c,d)// 1, ...

  6. usermod -修改使用者帐号

    总览 SYNOPSIS usermod [-c comment] [-d home_dir [-m]] [-e expire_date] [-f inactive_time] [-g initial_ ...

  7. while循环和for循环

    while循环 n='我怎么那么可爱呀' count= while count<len(n): print(n[count]) count+= for循环 n='我怎么那么可爱呀' for i ...

  8. forEarch 和 for in

    forEarch 遍历数组,遍历的过程中不能被终止,必须每一个值遍历一遍后才能停下来,for  in遍历对象中的属性 代码: <!DOCTYPE html> <html lang=& ...

  9. C语言 常量

    常量的定义:在运行过程中,其值不能改变的量称为常量. 常量的分类 整型常量  实型常量  字符常量 demo #include <stdio.h> void main() { printf ...

  10. Webstorm 、ECMAScript 6 、AngularJS

    突然接到一智障询问以上内容,大发善心总结(其实就是CV大法)一下下,希望能帮助某智障.....上干活! WebStorm 刚看到我是懵逼的,但是看到和其他两个在一起,猜想到是前台的一开始以为是前台框架 ...