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 ...
随机推荐
- Android 开源项目及库汇总(2)
Android 开源项目及库汇总(2) ListenToCode 2.7 2018.10.10 15:43 字数 8527 阅读 1001评论 0喜欢 29 地图 百度地图– Android百度地图 ...
- python全栈开发教程目录
python入门到进阶 Python基础2——数据类型的操作 Python基础——函数入门 Python基础——函数进阶 Python基础——函数的装饰器 Python基础——函数的装饰器 Pytho ...
- install-info - 更新 info/dir 项
SYNOPSIS 总览 install-info [OPTION]... [INFO-FILE [DIR-FILE]] DESCRIPTION 描述 从 Info 目录文件 DIR-FILE 中的文件 ...
- Ubuntu16.04下安装httpd+svn+viewVC
一.安装httpd 1.下载httpd 网址:http://httpd.apache.org/download.cgi#apache24 下载这一条---Source: httpd-2.4.39.ta ...
- ubuntu 安装nginx redis dotnet
1 安装nginx sudo apt-get update sudo apt-get install nginx 配置文件 /etc/nginx/nginx.conf 2 安装redis sudo a ...
- Thiago2(TPO AI.ROSTO):集成式AI换脸软件(Autodesk Flame)
如标题一样,Thiago2 是一款集成式AI换脸软件(TPO AI.ROSTO),需要与Autodesk Flame结合使用,从demo来看完成度还是很高的,算是一种完全GUI版的DeepFaceLa ...
- Java基本的程序结构设计 基本类型的输入输出
读取输入: java.util.Scanner 一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器. 了解: Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹 ...
- python绘制国际象棋棋盘核心代码
import turtle step = 40 for i in range(8): for j in range(8): turtle.penup() turtle.goto(i*step, j*s ...
- Django报错 No module named 'django.templates'
前言 Django 模板报错了 修改方法: 将你的工程文件下(my_site)的settings.py中的TEMPLATES中的templates字段全部改为template, 亲测可用~^~
- python类库26[sqlite]
一 sqlite 与 python 的类型对应 二 实例 import sqlite3 def sqlite_basic(): # Connect to db conn = sqlit ...