CompletableFuture之supplyAsync

本文代码内容来自:https://www.bilibili.com/video/BV1nA411g7d2/?spm_id_from=333.788

一、supplyAsync是什么?

CompletableFuture是Java 8引入的一个异步编程工具,它可以帮助我们更方便地进行并发编程和异步编程。supplyAsync是CompletableFuture类中的一个方法,用于在新的线程中执行指定的任务,并返回计算结果。

具体来说,supplyAsync方法接受一个Supplier类型的参数,该Supplier用于产生计算结果。当调用supplyAsync方法时,它会返回一个CompletableFuture对象,该对象会在新的线程中执行Supplier所指定的计算,并将计算结果保存在CompletableFuture对象中。

二、解析

1.代码

public class SmallTool {

    public static void sleepMillis(long millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void printTimeAndThread(String tag) {
        String result = new StringJoiner("\t|\t")
                .add(String.valueOf(System.currentTimeMillis()))
                .add(String.valueOf(Thread.currentThread().getId()))
                .add(Thread.currentThread().getName())
                .add(tag)
                .toString();
        System.out.println(result);
    }

}

public static void main(String[] args) {
        SmallTool.printTimeAndThread("小白进入餐厅");
        SmallTool.printTimeAndThread("小白点了 番茄炒蛋 + 一碗米饭");

        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("厨师炒菜");
            SmallTool.sleepMillis(200);
            return "番茄炒蛋";
        }).thenCompose(dish -> CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("服务员打饭");
            SmallTool.sleepMillis(100);
            return dish + " + 米饭";
        }));

        SmallTool.printTimeAndThread("小白在打王者");
        SmallTool.printTimeAndThread(String.format("%s 好了,小白开吃", cf1.join()));
    }

2.运行结果

3.相关分析

  1. 程序开始执行,调用 SmallTool.printTimeAndThread("小白进入餐厅")SmallTool.printTimeAndThread("小白点了 番茄炒蛋 + 一碗米饭") 打印小白进入餐厅和点菜的信息。

  2. 接着创建了一个 CompletableFuture 对象 cf1,通过 CompletableFuture.supplyAsync 方法实现了厨师炒菜的异步操作。当 CompletableFuture 的计算完成后,会立即执行 thenCompose 中的操作,也就是服务员打饭的异步操作。

  3. 在厨师炒菜的过程中,小白在打王者,程序会执行 SmallTool.printTimeAndThread("小白在打王者") 打印相关信息。

  4. 最后通过 cf1.join() 获取 CompletableFuture 的结果,并打印出"好了,小白开吃"的信息。

4.自我的相关理解:

CompletableFuture.supplyAsync() 方法用于创建一个异步任务,该任务会在一个新的线程中执行。因此,当调用 CompletableFuture.supplyAsync() 时,厨师炒菜的任务就会被提交到一个线程池中去执行。

由于线程池中的线程是并发执行的,所以厨师炒菜的任务和小白在打王者的任务是可以同时进行的。具体来说,在厨师炒菜的任务启动后,程序会立即执行下一行代码,也就是 SmallTool.printTimeAndThread("小白在打王者") 打印小白在打王者的信息。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值