CompletableFuture异步编排

1.创建异步对象

CompletableFuture提供了四个静态方法来创建一个异步操作

    public static ExecutorService executor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start.....");
//        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
//            System.out.println("当前线程:" + Thread.currentThread().getName());
//            int i = 10 / 2;
//            System.out.println("运行结果:" + i);
//        }, executor);
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("当前线程:" + Thread.currentThread().getName());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor);
        Integer i = future.get();
        System.out.println("主线程收到值:"+i+"  "+Thread.currentThread().getName());
        System.out.println("end.....");
    }

 2.计算完成是回调方法

1.无异常 

 public static ExecutorService executor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start.....");
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("当前线程:" + Thread.currentThread().getName());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).whenComplete((result,exception)->{
            //当执行完第一个异步任务的时候用同一个线程执行第二个异步任务
            System.out.println("异步任务成功完成  结果是· res="+result+",exception="+exception);
        });
        System.out.println("end.....");
    }

 

2.有异常

  public static ExecutorService executor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start.....");
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("当前线程:" + Thread.currentThread().getName());
            int i = 10 / 0;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).whenComplete((result,exception)->{
            //当执行完第一个异步任务的时候用同一个线程执行第二个异步任务
            System.out.println("异步任务成功完成  结果是· res="+result+",exception="+exception);
        });
        System.out.println("end.....");
    }

3.测试两个异常

    public static ExecutorService executor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start.....");
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("当前线程:" + Thread.currentThread().getName());
            int i = 10 / 0;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).whenComplete((result,exception)->{
            //当执行完第一个异步任务的时候用同一个线程执行第二个异步任务
            System.out.println("异步任务成功完成  结果是· res="+result+",exception="+exception);
            throw new RuntimeException("测试异常");
        }).exceptionally(ex->{
            System.out.println("执行出错:"+ex.getMessage());
            return 0;
        });
        Integer i = future.get();
        System.out.println("执行结果 i="+i);
        System.out.println("end.....");
    }

只会拿到第一个异常

3.Handler方法 

 public static ExecutorService executor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start.....");
        //方法执行完成后的处理,无论是成功完成的处理还是失败完成的处理
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("当前线程:" + Thread.currentThread().getName());
            int i = 10 / 0;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).handle((res,thr)->{
            //回调到主线程执行
            System.out.println("当前线程  ===:" + Thread.currentThread().getName());
            System.out.println(res+"    "+thr);
            return 0;
        });
        Integer i = future.get();
        System.out.println("执行结果 i="+i);
        System.out.println("end.....");
        executor.shutdown();
    }

 有点像RxJava

4.线程串行化的方法

 

 public static ExecutorService executor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start.....");
        //不能获取到上一步的执行结果
        CompletableFuture<Void> future1 = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("当前线程:" + Thread.currentThread().getName());
            int i = 10 / 1;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).thenRunAsync(()->{
            System.out.println("任务2启动了");
        },executor);
//        Void unused = future1.get();

//        System.out.println("执行结果 i="+i);
        System.out.println("end.....");
    }

  public static ExecutorService executor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start.....");
        //不能获取到上一步的执行结果
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("当前线程:" + Thread.currentThread().getName());
            int i = 10 / 0;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).thenApplyAsync(new Function<Integer, Integer>() {
            @Override
            public Integer apply(Integer integer) {
                return 0;
            }
        }, executor).whenCompleteAsync((o, throwable) -> {
            System.out.println("res=" + o + ",throwable=" + throwable);
        }, executor).exceptionally(e->{
            return 500;
        });
        Integer i = future.get();

        System.out.println("执行结果 i="+i);
        System.out.println("end.....");
    }

 1.测试执行

  public static ExecutorService executor = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start.....");
        //不能获取到上一步的执行结果
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("当前线程:" + Thread.currentThread().getName());
            int i = 10 / 1;
            System.out.println("运行结果:" + i);
            return i;
        }, executor).thenApplyAsync(new Function<Integer, Integer>() {
            @Override
            public Integer apply(Integer integer) {
                return 0;
            }
        }, executor).whenCompleteAsync((o, throwable) -> {
            System.out.println("res=" + o + ",throwable=" + throwable);
        }, executor).thenApplyAsync(integer -> {
            System.out.println("res=" + integer );
            return 30;
        },executor).whenCompleteAsync((integer, throwable) -> {
            System.out.println("任务3执行"+integer);

        }).whenCompleteAsync((integer, throwable) -> {
            System.out.println("任务4执行"+integer);

        }).exceptionally(e->{
            return 500;
        });
        Integer i = future.get();

        System.out.println("执行结果 i="+i);
        System.out.println("end.....");
    }

5.两任务组合 - 都要完成

 创建future(返回值、无返回值)

future处理(处理结果;处理异常;处理结果异常)

串行future(不接收返回值;接收返回值;产生返回值)

并行future(不接收返回值、接收返回值;产生返回值)

6.两任务组合,任意一个完成

 

 一个抛了异常,那么接下来没有使用接受异常的操作以外,其他的操作全部不执行

线程对象不用回收,因为是统一由线程池管理,不会造成内存泄漏

   public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start.....");
        //不能获取到上一步的执行结果
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("当前线程:" + Thread.currentThread().getName());
            int i = 10 / 1;
            System.out.println("运行结果:" + i);
            return i;
        }, executor);

        CompletableFuture<Integer> future1 = future.thenApplyAsync(integer -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {

            }
            System.out.println("任务2执行完成");
            return 300;
        });
        CompletableFuture<Integer> future2 = future.thenApplyAsync((integer) -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException a) {

            }
            System.out.println("任务3执行完成");
            return 2000;
        });

        System.out.println(future1 == future);

        future1.runAfterEitherAsync(future2, () -> {
            System.out.println("f1 或 f2 执行完了");
        }, executor);

        future1.applyToEitherAsync(future2, integer -> {
            System.out.println("谁先执行完 int = "+integer);
            return 0;
        }, executor);

//        System.out.println("执行结果 i="+i);
        System.out.println("end.....");
    }

7.多任务组合

1. allOf 

  public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> future01 = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("查询商品的图片信息");
            return "hello.jpg";
        }, executor);
        CompletableFuture<String> future02 = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("查询商品的属性");
            return "黑色+256G";
        }, executor);
        CompletableFuture<String> future03 = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("查询商品介绍");
            return "华为";
        }, executor);

        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(future01, future02, future03);
        System.out.println(":1");
        voidCompletableFuture.get();//等待所有的都做完
        System.out.println("sa");
        System.out.println("所有的结果都做完了:  "+future01.get()+","+future02.get()+","+future03.get());
    }

 

 2.anyOf

  public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> future01 = CompletableFuture.supplyAsync(() -> {//有返回值异步
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {

            }
            System.out.println("查询商品的图片信息");
            return "hello.jpg";
        }, executor);
        CompletableFuture<String> future02 = CompletableFuture.supplyAsync(() -> {//有返回值异步
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {

            }
            System.out.println("查询商品的属性");
            return "黑色+256G";
        }, executor);
        CompletableFuture<String> future03 = CompletableFuture.supplyAsync(() -> {//有返回值异步
            System.out.println("查询商品介绍");
            return "华为";
        }, executor);

        CompletableFuture<Object> anyOf = CompletableFuture.anyOf(future01, future02, future03);

        Object o = anyOf.get();//等待所有的都做完
        System.out.println("result = " + o);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/801685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mwwz库支持可视化每个特征点的匹配质量

支持获取每个特征点的匹配分数&#xff0c;同时支持擦除特征点。

数据库第6次作业

内容 1、创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay)&#xff0c;统计每个部门人数并计算平均工资。 …

【Datawhale AI夏令营】电力需求预测挑战赛 Task02

task02 Task2 版本教程将使用机器学习模型解决本次问题&#xff0c;模型使用简单&#xff0c;数据不需要过多预处理&#xff1b; 使用机器学习方法一般主要需要从 获取数据&增强、特征提取和模型 三个方面下手。 使用机器学习方法有哪几个步骤&#xff1f; 一般的使用机器…

摄像头 RN6752v1 视频采集卡

摄像头 AHD倒车摄像头比较好&#xff0c;AHD英文全名Analog High Definition&#xff0c;即模拟高清&#xff0c;拥有比较好的分辨率与画面质感。 RN6752v1 GQW AKKY2 usb 采集卡 FHD&#xff08;1080p&#xff09;、HD&#xff08;720p&#xff09;和D1&#xff08;480i&am…

局域网内放开端口

欢迎使用Markdown编辑器 点击完成后&#xff0c;其他内网机器就可以访问了。

ICT产业是什么?具体是干什么

前言&#xff1a; ICT产业&#xff0c;即信息与通信技术产业&#xff08;Information and Communication Technology&#xff09;&#xff0c;是一个涵盖了广泛技术和服务的综合产业。它主要包括计算机硬件、软件、网络和电信设备等领域。 ICT是由信息通信和技术的英文单词首…

Linux 内核模块加载知多少

文章目录 目录 1. 内核模块 内核模块的作用 2. 内核模块的加载 2.1 内核模块的加载过程 2.2 内核模块加载方式 使用 insmod 加载模块 使用 modprobe 加载模块 2.3 内核模块加载顺序 3. 常用的相关命令 4. 总结 工作还在继续&#xff0c;学习还在继续&#xff0c;学习…

RK3568笔记三十七:按键驱动实验(设备树)

若该文为原创文章&#xff0c;转载请注明原文出处。 一、编程思路 程序编写的主要内容为添加 key 的设备树节点、在驱动程序中使用 of 函数获取设备节点中的属性&#xff0c;编写测试应用程序。 • 首先向设备树添加 key 设备节点。 • 其次编写平台设备驱动框架&#xff0c;…

autohotkey+vscode 替代 linux下vim方案(记忆零成本)

autohotkeyvscode 替代 linux下vim方案(记忆零成本) 先看效果和移动方案 效果 命令行下 1.新建文件 code hello.c2.然后弹出 vs code 现在就是相当于在无限制记事本里面了 方案 下面展示快捷键方案 摸着键盘上的小凸起, 上下左右,直接起飞 i:上 , k:下,j:左,L:右 H:行…

AI绘画Stable Diffusion 零基础入门 —AI 绘画原理与工具介绍,万字解析AI绘画的使用教程

大家好&#xff0c;我是设计师阿威 想要入门 AI 绘画&#xff0c;首先需要了解它的原理是什么样的。 其实很早就已经有人基于深度学习模型展开了对图像生成的研究了&#xff0c;但在那时&#xff0c;生成的图像分辨率和内容都非常抽象。 直到近两年&#xff0c;AI 产出的图像…

AI+折叠屏,荣耀的创新周期论

文&#xff5c;刘俊宏 编&#xff5c;王一粟 2024年&#xff0c;AI和折叠屏的演进路线&#xff0c;已经成为了手机行业的共识。 首先&#xff0c;手机市场的新增量已经被折叠屏所接管。据Counterpoint Research数据显示&#xff0c;中国2024年第一季度折叠屏手机销量同比增长…

3、计算机网络通信及其编程:深入Linux内核理解epoll

Linux网络 IO模型 同步和异步&#xff0c;阻塞和非阻塞 同步和异步 同步和异步关注的是调用方是否主动获取结果。 同步&#xff1a;同步的意思就是调用方需要主动等待结果的返回。异步&#xff1a;异步的意思就是不需要主动等待结果的返回&#xff0c;而是通过其他手段比如…

为什么用ssh连接服务器会出现错误?

当我们尝试通过 SSH 连接到服务器时可能会发生许多情况&#xff0c;比如出现“连接被拒绝”的错误。虽然导致 SSH 连接错误的原因可能有多种&#xff0c;但以下是其中常见的几种&#xff1a; 1.您的 SSH 服务已关闭。 2.您的凭证有误。 3.您尝试使用的端口已关闭。 4.您的服务器…

SQL 中的 EXISTS 子句:探究其用途与应用

目录 EXISTS 子句简介语法 EXISTS 与 NOT EXISTSEXISTS 子句的工作原理实际应用场景场景一&#xff1a;筛选存在关联数据的记录场景二&#xff1a;优化查询性能 EXISTS 与其他 SQL 结构的比较EXISTS vs. JOINEXISTS vs. IN 多重 EXISTS 条件在 UPDATE 语句中使用 EXISTS常见问题…

部署kafkamanager

1&#xff0c;检查kafka的版本 到lib下查看 libs/kafka-clients-0.11.0.3.jar kafka的版本 0.11 2&#xff0c;下载kafkamanager 链接&#xff1a; https://pan.baidu.com/s/1qYifoa4 密码&#xff1a;el4o 3&#xff0c;解压后更改该conf下conf/application.conf 中zkhosts …

六、Accelerate + Deepspeed

帮up宣传一下&#xff0c;优质up值得信赖&#xff01; B站UP&#xff1a;你可是处女座啊 文章目录 理论知识DP&DDPDeepspeed介绍注意事项多机多卡 实战ddp_accelerate.py原先显存DDP 运行Deepspeed 运行方式一-zero2方式二 -zero2方式一 -zero3方式二 -zero3 ddp_trainer…

在 Windows 上运行 Linux:WSL2 完整指南(一)

系列文章目录 在 Windows 上运行 Linux&#xff1a;WSL2 完整指南&#xff08;一&#xff09;&#x1f6aa; 在 Windows 上运行 Linux&#xff1a;WSL2 完整指南&#xff08;二&#xff09; 文章目录 系列文章目录前言一、什么是 WSL&#xff1f;1.1 WSL 的主要特性1.2 WSL 的…

[WUSTCTF2020]level4题解 入土为安的第三天

二叉树 Practice my Data Structure code..... Typing....Struct.....char....*left....*right............emmmmm...OK! Traversal! Traversal type 1:2f0t02T{hcsiI_SwA__r7Ee} Traversal type 2:20f0Th{2tsIS_icArE}e7__w Traversal type 3: //type3(&x[22]); No w…

Schematics,一个牛逼的python库用于数据验证和转换的库

目录 什么是Schematics&#xff1f; 为什么使用Schematics&#xff1f; 安装Schematics 定义模式 验证数据 自定义验证 转换数据 结语 什么是Schematics&#xff1f; 在Python的世界中&#xff0c;Schematics是一个用于数据验证和转换的库。它通过定义数据结构的模式(…

Windows搭建RTMP视频流服务器

参考了一篇文章&#xff0c;见文末。 博客中nginx下载地址失效&#xff0c;附上一个有效的地址&#xff1a; Index of /download/ 另外&#xff0c;在搭建过程中&#xff0c;遇到的问题总结如下&#xff1a; 1 两个压缩包下载解压并重命名后&#xff0c;需要 将nginx-rtmp…