首页 > 其他分享 >CompletableFuture Demo

CompletableFuture Demo

时间:2024-03-08 17:55:38浏览次数:25  
标签:10 int Demo dataBaseClient resultList CompletableFuture public

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左右。

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

标签:10,int,Demo,dataBaseClient,resultList,CompletableFuture,public
From: https://www.cnblogs.com/keboom/p/18061548

相关文章

  • DELL EMC unity demo
    1.unity介绍Unity属于DellEMC推出的中端存储阵列,其既支持文件存储,也支持块存储,还拥有丰富的数据服务功能,旨在满足客户对灵活性、实惠性和简洁性的需求。DellEMCUnity产品线包括Hybrid(SSD+机械硬盘)类型的300/400/500/600型号,以及全闪存的300F/400F/500F/600F型号,以及......
  • 如何在MinGW GCC中查询Windows服务的状态?启动、停止 Windows 服务 Demo
    使用MinGWGCC完成查询Windows服务的状态:#include<windows.h>#include<stdio.h>//查询服务状态的函数voidQueryServiceStatus(constchar*serviceName){SC_HANDLEscm,service;SERVICE_STATUSstatus;//打开服务控制管理器scm=OpenSCMana......
  • demo要点
    demo要点1.体现如何获取字段的值2.检查接口返回值如果返回错误,则弹出提示:流程创建失败,请联系管理员,或稍后重试如果超时,则弹出提示:流程创建超时,第三方系统异常,请联系管理员,或稍后重试正确的返回结果为:{"msg":"操作成功","code":0}错误的结果为:{"msg......
  • CompletableFuture使用说明
    前言创建线程的方式只有两种:继承Thread或者实现Runnable接口。但是这两种方法都存在一个缺陷,没有返回值Java1.5以后,可以通过向线程池提交一个Callable来获取一个包含返回值的Future对象Future接口的局限性当Future的线程进行了一个非常耗时的操作,那我们的主线程也就阻塞了......
  • 在写ts的demo时,经常给文件添加export {},作用是什么
    在TypeScript中,当你在一个文件中添加export{}时,其作用主要有以下几点:创建模块(Module):在TypeScript中,每个.ts文件都是一个模块。通过添加空的export{},即使该文件当前没有实际导出任何内容,也明确地将文件标记为一个模块。这样可以确保其他文件可以通过导入(import)来使......
  • JAVA之CompletableFuture
    目录CompletableFuture入门学习内容学习目标课程学习说明1、FuturevsCompletableFuture1.1准备工作1.2Future的局限性1.3CompletableFuture的优势2、创建异步任务2.1runAsync2.2supplyAsync2.3异步任务中的线程池2.4异步编程思想3、异步任务回调3.1thenApply3.2thenA......
  • Vue+Vite+Ts+Python后端demo
    一、创建前端工程1.安装node进入官网下载:Node.js(nodejs.org) 选择安装路径后,默认安装;确认是否成功安装: 2.创建vite项目①:npminitvite@latest②:输入项目名、选择Vue、选择Ts;cd到项目文件夹里;安装依赖项:npmi,启动项目:npmrundev③:打开浏览器,进入:http://localhost:5......
  • 浙江中控 inplantscada 安装 demo运行报错
    1、卸载inplantscada和杀毒软件。重新安装inplantscada(成功跑起来)。安装虚拟机win7跑不起来。2、还原官网下载的电气demo程序。 成功截图:    没有重装inplantscada和卸载杀毒软件,运行demo报错截图:  备注:建index页面。管理员方式运行,也解决不了,只有重新安装i......
  • vscode报错,nodemon 在此系统上禁止运行脚本
    1.vscode报错,nodemon:因为在此系统上禁止运行脚本注意:不仅仅适用于nodemon报错,报在此系统上禁止运行脚本的错都可以用以下方法解决2.报错原因分析:windows为了安全,默认的执行策略为Restricted,因此需要将执行策略设置为RemoteSigned即可3.解决方法  (1)get-exec......
  • C#索引器demo
    //简单实例publicclassMyClass{privatestring[]myArray=newstring[5];//索引器publicstringthis[intindex]{get{returnmyArray[index];}set{myArray[index]=value;......