当前位置: 首页 > article >正文

【Java异步编程】CompletableFuture综合实战:泡茶喝水与复杂的异步调用

文章目录

    • 一. 两个异步任务的合并:泡茶喝水
    • 二. 复杂的异步调用:结果依赖,以及异步执行调用等

一. 两个异步任务的合并:泡茶喝水

下面的代码中我们实现泡茶喝水。这里分3个任务:任务1负责洗水壶、烧开水,任务2负责洗茶壶、洗茶杯和拿茶叶,任务3负责泡茶。其中任务3要等待任务1和任务2都完成后才能开始。

public class DrinkTea {
    private static final int SLEEP_GAP = 3;//等待3秒

    public static void main(String[] args) {
        // 异步任务1
        CompletableFuture<Boolean> washJob = CompletableFuture.supplyAsync(() ->
        {
            Print.tcfo("洗茶杯");
            //线程睡眠一段时间,代表清洗中
            sleepSeconds(SLEEP_GAP);
            Print.tcfo("洗完了");
            return true;
        });

        // 异步任务2
        CompletableFuture<Boolean> hotJob = CompletableFuture.supplyAsync(() ->
        {
            Print.tcfo("洗好水壶");
            Print.tcfo("烧开水");

            //线程睡眠一段时间,代表烧水中
            sleepSeconds(SLEEP_GAP);
            Print.tcfo("水开了");
            return true;

        });


        // 等待任务1,2执行完成后,任务3执行thenCombine
        CompletableFuture<String> drinkJob =
                //hotOk、washOK,指的是两个异步任务的返回结果
                washJob.thenCombine(hotJob, (hotOk, washOK) ->
                {
                    if (hotOk && washOK) {
                        Print.tcfo("泡茶喝,茶喝完");
                        return "茶喝完了";
                    }
                    return "没有喝到茶";
                });

        // 阻塞主线程:等待任务 3 执行结果
        Print.tco(drinkJob.join());

    }

执行日志:

[ForkJoinPool.commonPool-worker-9|DrinkTea.lambda$main$0]:洗茶杯
[ForkJoinPool.commonPool-worker-2|DrinkTea.lambda$main$1]:洗好水壶
[ForkJoinPool.commonPool-worker-2|DrinkTea.lambda$main$1]:烧开水
[ForkJoinPool.commonPool-worker-9|DrinkTea.lambda$main$0]:洗完了
[ForkJoinPool.commonPool-worker-2|DrinkTea.lambda$main$1]:水开了
[ForkJoinPool.commonPool-worker-9|DrinkTea.lambda$main$2]:泡茶喝,茶喝完
[main]:茶喝完了
JVM退出钩子(定时和顺序任务线程池) starting.... 
JVM退出钩子(定时和顺序任务线程池)  耗时(ms): 1

通过整体的执行过程可以发现:

  1. 给任务分配线程的工作由线程池自动完成。
  2. 任务之间的依赖关系一目了然。以下面的伪代码为例:
     job3 = job1.thenCombine( job2, (result1, result2)->{回调逻辑})

等待任务1,2执行完成后,任务3执行thenCombine,其中result1、result2是任务1、任务2的返回值。基于两个异步任务的返回值判断是否进行泡茶喝。

  1. join: 阻塞主线程:等待任务 3 执行结果

参考:《Java高并发核心编程》-尼恩

 

二. 复杂的异步调用:结果依赖,以及异步执行调用等

具体代码查看gitee提交:[并发编程]CompletableFuture实现复杂的异步调用:结果依赖,以及异步执行调用等

具体实现了:

  1. 通过策略模式,实现了流程下各个执行逻辑
  2. 通过使用CompletableFuture实现各执行逻辑异步执行
  3. 通过使用thenRunAsync等待前面步骤执行,进而实现5,6步的异步执行,加快执行速度
  4. 使用CompletableFuture.allOf(step5, step6),合并5,6步的结果。

http://www.kler.cn/a/528054.html

相关文章:

  • 线性代数复习笔记
  • 【深度分析】DeepSeek大模型技术解析:从架构到应用的全面探索
  • MySQL知识点总结(十七)
  • langchain基础(二)
  • SpringBoot 原理分析
  • 【letta】The Letta Platform LETTA平台
  • 【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》040-Vue过渡动画
  • git基础使用--1--版本控制的基本概念
  • Flutter常用Widget小部件
  • 数据结构 树2
  • Spring Boot 实例解析:从概念到代码
  • STM32 01 LED
  • [原创](Modern C++)现代C++的关键性概念: 流格式化
  • 网络基础
  • 8.[前端开发-CSS]Day08-图形-字体-字体图标-元素定位
  • 【Git】初识Git Git基本操作详解
  • XML Schema 数值数据类型
  • 物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】
  • 50. 正点原子官方系统镜像烧写实验
  • 100.1 AI量化面试题:解释夏普比率(Sharpe Ratio)的计算方法及其在投资组合管理中的应用,并说明其局限性
  • 什么是“知识蒸馏”
  • 云计算部署模式全面解析
  • HTML5 技术深度解读:本地存储与地理定位的最佳实践
  • ArkTS语言介绍
  • 全程Kali linux---CTFshow misc入门(25-37)