Future 和 CompletableFuture 异步任务 in Java
Future 异步任务
定义Callable接口的实现
import java.util.concurrent.Callable;
public class RealDataCallable implements Callable<String> {
private String para;
public RealDataCallable(String para) {
this.para = para;
}
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for(int i=0; i<10; i++) {
sb.append(para);
Thread.sleep(1000);
}
return sb.toString();
}
}
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask; public class FutureDemo { public static void main(String[] args) throws InterruptedException, ExecutionException { FutureTask<String> future = new FutureTask<String>(new RealDataCallable("a")); ExecutorService es = Executors.newFixedThreadPool(1);
//Future 是异步任务,提交请求之后,这里必然是立即返回的,因为程序不会阻塞
//接下来,不用关心数据是如何产生的。
//可以去做一些额外的事情,然后在需要的时候可以通过Future.get()得到实际的数据
es.submit(future);
System.out.println("请求完毕"); //使用 sleep 代替其他业务逻辑的处理
Thread.sleep(1000);
//获得call()方法的返回值,如果此时call()方法没有执行完成,则会等待
System.out.println("数据: " + future.get());
} }
通过CompletableFuture 提供的进一步封装,可以很容易实现Future模式那样的异步调用。
实例如下:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException; public class AsyncTaskUseCompletableFuture { public static void main(String[] args) throws InterruptedException, ExecutionException { final CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> calc(50)); System.out.println(future.get()); }
public static Integer calc(Integer para) {
try {
//模拟一个长时间的执行
Thread.sleep(1000);
} catch (InterruptedException e) {
} return para * para;
} }
CompletableFuture 的组合
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException; public class ComposeCompletableFuture { public static void main(String[] args) throws InterruptedException, ExecutionException { //thenCompose 组合CompletableFuture
// CompletableFuture<Void> fu = CompletableFuture.supplyAsync(() -> calc(50))
// .thenCompose((i) -> CompletableFuture.supplyAsync(() -> calc(i)))
// .thenApply((str) -> "\"" + str + "\"" )
// .thenAccept(System.out::println); //thenCombine 组合CompletableFuture
CompletableFuture<Integer> intFuture = CompletableFuture.supplyAsync(() -> calc(50));
CompletableFuture<Integer> intFuture2 = CompletableFuture.supplyAsync(() -> calc(25)); CompletableFuture<Integer> fu = intFuture.thenCombine(intFuture2, (i,j) -> (i + j)); System.out.println(fu.get()); } public static Integer calc(Integer para) {
return para / 2;
}
}
Future 和 CompletableFuture 异步任务 in Java的更多相关文章
- Future、 CompletableFuture、ThreadPoolTaskExecutor简单实践
一 Future(jdk5引入) 简介: Future接口是Java多线程Future模式的实现,可以来进行异步计算. 可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算 ...
- Java8 中增强 Future:CompletableFuture
增强的 Future:CompletableFuture CompletableFuture(它实现了 Future 接口) 和 Future 一样,可以作为函数调用的契约.当你向它请求获得结果,如果 ...
- 使用 CompletableFuture 异步组装数据
使用 CompletableFuture 异步组装数据 一种快捷.优雅的异步组装数据方式 实际项目中经常遇到这种情况: 从多个表中查找到数据然后拼装成一个VO返回给前端. 这个过程有可能会非常耗时.因 ...
- 编程老司机带你玩转 CompletableFuture 异步编程
本文从实例出发,介绍 CompletableFuture 基本用法.不过讲的再多,不如亲自上手练习一下.所以建议各位小伙伴看完,上机练习一把,快速掌握 CompletableFuture. 个人博文地 ...
- CompletableFuture异步编排
什么是CompletableFuture CompletableFuture是JDK8提供的Future增强类.CompletableFuture异步任务执行线程池,默认是把异步任务都放在ForkJo ...
- 带你玩转CompletableFuture异步编程
前言 最近在忙生活的第一个OKR,这个等等后面具体聊聊,今天开始恢复每周一篇原创,感谢小伙伴的不离不弃.这篇文章也是最近在Code Review的时候,看到的大家代码,想整体推下大家异步编程的思想,由 ...
- Dubbo中CompletableFuture异步调用
使用Future实现异步调用,对于无需获取返回值的操作来说不存在问题,但消费者若需要获取到最终的异步执行结果,则会出现问题:消费者在使用Future的get()方法获取返回值时被阻塞.为了解决这个问题 ...
- 使用 Vert.X Future/Promise 编写异步代码
Future 和 Promise 是 Vert.X 4.0中的重要角色,贯穿了整个 Vert.X 框架.掌握 Future/Promise 的用法,是用好 Vert.X.编写高质量异步代码的基础.本文 ...
- Elasticsearch启动报错:future versions of Elasticsearch will require Java 11
1 future versions of Elasticsearch will require Java 11; your Java version from [C 2 :\Program Files ...
随机推荐
- 洛谷 P1972 HH的项链 题解
题面 本题其实主要就这几点: 1.离线,以右端点排序(从小到大); 2.建立树状数组c[],c[i]表示从1~i中有多少种不同的数字: 3.对于每次查询的答案就是sum(r)-sum(l-1); 4. ...
- 090、ELK完成部署和使用 (2019-05-13 周二)
参考https://www.cnblogs.com/CloudMan6/p/7787870.html 上节我们已经部署了容器化的ELK,本节我们学习如何将日志导入ELK并进行图形化展示. 几乎 ...
- SVM支持向量机(1)
一.SVM模型 1.函数间隔与几何间隔,哪一条线是最好的? (1)公式化问题. 分类模型:当里面的值小于0的时候就是-1,当里面的值是大于等于0的时候就是1 函数间隔:前面乘以y(i),是为了保持数值 ...
- 日语能力考试N2级必备外来语
日语能力考试N2级必备外来语 ア行外来语アンテナ:(antenna) 天线インタビュー :(interview) 采访,访谈ウイルス:(virus ) 病 ...
- Java学习笔记-----eclipse中建立Java项目并成功运行
环境:WIN7 64位 +eclipse 2018 12version 具体方法:https://jingyan.baidu.com/album/9c69d48fefa53113c9024eb3.ht ...
- Java 计算两点间的全部路径(一)
算法要求: 在一个无向连通图中求出两个给定点之间的所有路径: 在所得路径上不能含有环路或重复的点: 算法思想描述: 整理节点间的关系,为每个节点建立一个集合,该集合中保存所有与该节点直接相连的节点(不 ...
- php 中英文混合字符串长度计算
(strlen($string) + mb_strlen($string,'UTF8')) / 2;tw 这样计算的
- MATLAB中的函数句柄及其应用
1.函数句柄的创建 函数句柄(function handle)是MATLAB中的一类特殊的数据结构,它的地位类似于其它计算机语言里的函数对象(Javascript,Python),函数指针(C++), ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(1)|开篇]
今天我们来开一个新系列. 从零学习rustlang. 简单介绍下rustlang: Rust 是一门系统级编程语言,被设计为保证内存和线程安全,防止段错误产生.作为系统级编程语言,它的基本理念是 “零 ...
- python基础练习题4
题目:现有一个数据库记录文件(0005.txt)保证了学生课程签到的数据记录('2017-03-13 11:50:09',271,131),('2017-03-14 11:52:19',273,131 ...