首页 > 其他分享 >CompletableFuture的使用

CompletableFuture的使用

时间:2023-03-20 23:00:26浏览次数:35  
标签:200 return printTimeAndThread sleepMillis SmallTool CompletableFuture 使用

1、开启子线程并获取子线程结果

  @Test
    public void test1() {
        SmallTool.printTimeAndThread("媳妇进入餐厅");
        SmallTool.printTimeAndThread("媳妇点饭, 蛋炒饭 + 米饭");
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("厨师炒菜");
            SmallTool.sleepMillis(200);
            SmallTool.printTimeAndThread("厨师盛饭");
            SmallTool.sleepMillis(200);
            return "饭做好了";
        });
        SmallTool.printTimeAndThread("媳妇在玩手机");
        SmallTool.printTimeAndThread(String.format("%s, 媳妇开吃",future.join()));
    }

2、thenCompose:连接两个异步任务(第一个异步任务完成后执行第二个异步任务)

  @Test
    public void test2() {
        SmallTool.printTimeAndThread("媳妇进入餐厅");
        SmallTool.printTimeAndThread("媳妇点饭, 蛋炒饭 + 米饭");
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("厨师炒菜");
            SmallTool.sleepMillis(200);
            return "饭做好了";
        }).thenCompose(res -> CompletableFuture.supplyAsync(() -> { //厨师炒完菜服务员才端饭
            SmallTool.printTimeAndThread(res);
            SmallTool.printTimeAndThread("服务员端饭");
            SmallTool.sleepMillis(200);
            return "饭盛好了";
        }));
        SmallTool.printTimeAndThread("媳妇在玩手机");
        SmallTool.printTimeAndThread(String.format("%s, 媳妇开吃",future.join()));
    }

3、thenCombine:两个异步任务并行执行

  @Test
    public void test3() {
        SmallTool.printTimeAndThread("媳妇进入餐厅");
        SmallTool.printTimeAndThread("媳妇点饭, 蛋炒饭 + 米饭");
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("厨师炒菜");
            SmallTool.sleepMillis(200);
            return "菜做好了";
        }).thenCombine(CompletableFuture.supplyAsync(() -> { //炒菜和做饭同时进行
            SmallTool.sleepMillis(200);
            return "米饭做好了";
        }), (r1, r2) -> {
            SmallTool.printTimeAndThread("服务员端饭");
            SmallTool.sleepMillis(200);
            return String.format("%s和%s做好了", r1, r2);
        });
        SmallTool.printTimeAndThread("媳妇在玩手机");
        SmallTool.printTimeAndThread(String.format("%s, 媳妇开吃",future.join()));
    }

4、appltToEither:两个异步任务只有有一个执行完毕。exceptionally:异步任务中发送异常时执行

  @Test
    public void test5() {
        SmallTool.printTimeAndThread("小白吃完饭打车");
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("700路公交车来了");
            SmallTool.sleepMillis(200);
            return "700路公交";
        }).applyToEither(CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("800路公交车来了");
            SmallTool.sleepMillis(200);
            return "800路公交";
        }), firstComeBus -> {
            if(firstComeBus.startsWith("700")) {
                throw new RuntimeException("撞树上了");
            }
            return firstComeBus;
        }).exceptionally(e -> {
            SmallTool.printTimeAndThread("小白叫出租车");
            SmallTool.sleepMillis(200);
            return "出租车 叫到了";
        });
        SmallTool.printTimeAndThread(String.format("%s",future.join()));
    }

未完待续......

标签:200,return,printTimeAndThread,sleepMillis,SmallTool,CompletableFuture,使用
From: https://www.cnblogs.com/wscw/p/17238320.html

相关文章

  • admin使用及models.py中__str__(self)的用法
    1.admin页面中修改成中文表名:   2.models中的__str__用法:   2_2.models中的__str__用法:  ......
  • django中使用分页器功能
    要使用Django实现分页器,必须从Django中导入Paginator模块fromdjango.core.paginatorimportPaginator假如现在有150条记录要显示,每页显示10条>>>fromdjango.co......
  • PopupWindow(悬浮框)的基本使用
    后一个用于显示信息的UI控件——PopupWindow(悬浮框),如果你想知道他长什么样子,你可以打开你手机的QQ,长按列表中的某项,这个时候后弹出一个黑色的小对话框,这种就是PopupWindow......
  • Orleans简单使用
    .NET7更新后Orleans也随着更新了一个大版本,但是感觉微软官方的文档并不是很好,这里写个小demo来演示简单的集群管理(本次使用redis,官方文档甚至都没有提过redis),可以参考Orl......
  • 如何使用ChatGPT赚钱之四
    目前网络上最热门的话题之一是如何使用ChatGPT赚钱。我们的文章讨论了使用AI工具赚钱的13种简单方法。我们将提供一些实际示例,说明如何从AI获得您想要的东西。由Elo......
  • docker镜像中所有方法无法使用
    事情的起因是,我在win11的电脑上进行开发,将docker容器打包成镜像,再移植进服务器,再从镜像运行的容器中所有方法和命令都无法使用。最后的原因是,docker版本差别过大,所以应当......
  • Unbuntu22.04使用NVM安装NodeJS
    一、使用NVM(NodeVersionManager)1.在NVMgithub上的readme获取一行命令curl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh|bash或wge......
  • 从0到1构建springboot web应用镜像并使用容器部署
    文章目录​​一、生成镜像的两种方法​​​​1.1、使用commit生成镜像​​​​1.1.1、拉取Centos基础镜像​​​​1.1.2、启动Centos容器并安装Go​​​​1.1.3、commit生成......
  • 全志系列芯片如何在Tina Linux中使用脚本完成定制化升级?
    1.主题在TinaLinux中,如何使用脚本完成定制化升级2.问题背景硬件:全平台软件:Tina其他:支持OTA升级的平台,可实现脚本定制化升级3.具体表现在OTA升级过程中,添加定制化需......
  • hyperfine 使用指南
    hyperfine使用指南简介测量程序运行耗时是一个常见的需求。我们经常会调整自己编写的程序,来给程序加速。但是自己提出的加速计划,不一定会被机器认可。比如,你觉得++i......