CompletableFuture Demo

题目:有一个数据库client,从数据库中取数据A和数据B,然后求和。请使用并发的知识,尽快的完成操作。

/**
* {@code @author:} keboom
* {@code @date:} 2024/3/8
* {@code @description:}
*/
public class DataBaseClient { @SneakyThrows
public int getAge() {
Thread.sleep(randomSpeed());
return 18;
} @SneakyThrows
public int getOtherAge() {
Thread.sleep(randomSpeed());
return 20;
} private int randomSpeed() {
return (int) (Math.random() * 1000);
} @SneakyThrows
public static void main(String[] args) {
long start = System.currentTimeMillis();
DataBaseClient dataBaseClient = new DataBaseClient();
ArrayList<Integer> resultList = new ArrayList<>(10);
Semaphore semaphore = new Semaphore(0);
for (int i = 0; i < 10; i++) {
CompletableFuture<Integer> t1 = CompletableFuture.supplyAsync(dataBaseClient::getAge);
CompletableFuture<Integer> t2 = CompletableFuture.supplyAsync(dataBaseClient::getOtherAge);
CompletableFuture<Integer> result = t1.thenCombine(t2, (age1, age2) -> age1 + age2);
result.thenAccept((resultAge) -> {
resultList.add(resultAge);
semaphore.release();
}); // 这是串行的写法
// int a2 = dataBaseClient.getOtherAge();
// int a1 = dataBaseClient.getAge();
// resultList.add(a1 + a2);
// 这是串行的写法
} semaphore.acquire(10);
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}

main函数中是我们自己写的代码,我们通过CompletableFuture异步的从DataClient获取数据,然后求和,放到resultList中。我这里只模拟了10次。最终结果大概耗时 1.6s 左右。

如果是串行的话,是10s左右。

如果有更好的写法,欢迎评论区分享。

CompletableFuture Demo的更多相关文章

  1. 多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture

    目录 1.Futrue 2.FutureTask 3.CompletionService 4.CompletableFuture 5.总结 ================正文分割线========= ...

  2. 从CompletableFuture到异步编程设计

    从CompletableFuture到异步编程设计,笔者就分为2部分来分享CompletableFuture异步编程设计,前半部分总结下CompletableFuture使用实践,后半部分分享下Com ...

  3. 同步OR异步?WebFlux开发真的比Servlet开发要快?顺便再科普下CompletableFuture

    在看下文之前,先给大家科普一点基础知识 Runable:线程任务类接口,没有返回值 Callable:与上面的不同就是有返回值 Executor:定义了线程池执行任务的接口,不过只定义了Runable ...

  4. 开发dubbo应用程序(一)入门demo详解

    1.简介: 引用自Dubbo官方文档简介: http://dubbo.apache.org/zh-cn/docs/user/dependencies.html 随着互联网的发展,网站应用的规模不断扩大 ...

  5. 听说你还不知道CompletableFuture?

    java8已经在日常开发编码中非常普遍了,掌握运用好它可以在开发中运用几行精简代码就可以完成所需功能.今天将介绍CompletableFuture的在生产环境如何使用实践.CompletableFut ...

  6. 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  7. 【CompletableFuture】CompletableFuture中join()和get()方法的区别

    一.相同点: join()和get()方法都是用来获取CompletableFuture异步之后的返回值 二.区别: 1.join()方法抛出的是uncheck异常(即未经检查的异常),不会强制开发者 ...

  8. 【JDK8】Java8 优雅的异步调用API CompletableFuture

    1.CompletableFuture是什么? CompletableFuture是JDK8的新特性之一,是异步调用相关的API,用于简化异步调用,提高异步调用的效率 2.CompletableFut ...

  9. JUC 并发编程--04 常用的辅助类CountDownLatch , CyclicBarrier , Semaphore , 读写锁 , 阻塞队列,CompletableFuture(异步回调)

    CountDownLatch 相当于一个减法计数器, 构造方法指定一个数字,比如6, 一个线程执行一次,这个数字减1, 当变为0 的时候, await()方法,才开始往下执行,, 看这个例子 Cycl ...

  10. Java CompletableFuture 异步超时实现探索

    作者:京东科技 张天赐 前言 JDK 8 是一次重大的版本升级,新增了非常多的特性,其中之一便是 CompletableFuture.自此从 JDK 层面真正意义上的支持了基于事件的异步编程范式,弥补 ...

随机推荐

  1. .NET Core(C#) PadLeft和PadRight特定格式字符串长度补齐的方法和js中如何填充字符串

    .NET Core(C#) 1、PadLeft和PadRight使用说明 两个方法都是对字符串格式化进行补齐填充,PadLeft是左边,而PadRight是右边 '1010'.PadLeft(10,' ...

  2. svn把文件日期设置为最后提交的时间

    在使用svn进行checkout或update时,我想让文件的日期为提交那时的日期,这要怎样做? 说明:我是在windows下使用TortoiseSVN进行操作的 方法1.修改config [misc ...

  3. vim 从嫌弃到依赖(15)——寄存器

    在计算机里面也有寄存器,计算机中的寄存器是看得见,摸得着的实体,寄存器中存储需要经常访问的一些数据.而vim中也有寄存器的概念,vim中的寄存器是一个虚拟的概念,更像是一块专门用来存储数据的内存缓冲区 ...

  4. js下载附件(文件时候),文件名一直不出现乱码

    if (lastUrl.name) { //我们后端很奇怪有时候是个对象属性,有时候是个string window.open(url + `?attname=${lastUrl.name}`); } ...

  5. 全新Self-RAG框架亮相,自适应检索增强助力超越ChatGPT与Llama2,提升事实性与引用准确性

    全新Self-RAG框架亮相,自适应检索增强助力超越ChatGPT与Llama2,提升事实性与引用准确性 1. 基本思想 大型语言模型(LLMs)具有出色的能力,但由于完全依赖其内部的参数化知识,它们 ...

  6. C/C++ 常用排序算法整理

    (伪)冒泡排序算法: 相邻的两个元素之间,如果反序则交换数值,直到没有反序的记录为止. #include <stdio.h> void BubbleSort(int Array[], in ...

  7. ESXi6.5导入虚拟机提示缺少所需的磁盘镜像

    环境 esxi6.7 错误提示 解决方案 原因:这是因为导出虚拟机的时候,没有把"CD/DVD驱动器"删掉,在导入的时候,找不到这个磁盘映像. 编辑.ovf文件,找到ovf:hre ...

  8. PHP实现字符串反转

    方法一 用自带的函数strrev echo strrev('hello'); 方法二 自写循环方法 $str = 'hello'; $i = strlen($str); $newStr=''; whi ...

  9. C语言中如何使两个整型变量计算出浮点型结果

    遭遇的问题 在学习时有一个课后题要求计算两个变量的加减乘除以及取余,想到除法可能会计算出小数,就用浮点型接收除法的结果 int a,b: double div; div = a / b; 但是算出来的 ...

  10. Codeforces Round #884 (Div. 1 + Div. 2) A-E

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...