CompletableFuture的使用方法

CompletableFuture基础使用方法


前言

如何利用Java1.8中的CompletableFuture实现多线程操作


提示:以下是本篇文章正文内容,下面Demo可供参考,具体业务场景需要进一步扩展

一、CompletableFuture是什么?

CompletableFuture在Java里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息

二、本次演示Demo场景

大熊去餐厅吃饭,点了红烧肉和米饭,然后看着电视剧等红烧肉和米饭送来,菜上以后,大熊开吃

二、代码实现

1.创建本次测试使用的工具类SmallTool

代码如下(示例):

import java.util.StringJoiner;

/**
 * @ClassName SmallTool
 * @Description 多线程测试使用工具
 * @Author 码头土夫子_Gao
 * @Date 2021/11/24 14:40
 * @Version 1.0
 **/
public class SmallTool {

    public static void sleepMillis(long mills) {
        try {
            Thread.sleep(mills);
        } 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);
    }

}

2.创建测试类CompletableFutureTest

代码如下(示例):

import java.util.concurrent.CompletableFuture;

/**
 * @ClassName test3
 * @Description CompletableFuture 测试
 * @Author 码头土夫子_Gao
 * @Date 2021/11/24 15:08
 * @Version 1.0
 **/
public class CompletableFutureTest {

    public static void main(String[] args) {
        SmallTool.printTimeAndThread("大熊进入餐厅");
        SmallTool.printTimeAndThread("大熊点了 红烧肉 + 一碗米饭");
        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            SmallTool.printTimeAndThread("厨师炒红烧肉");
            SmallTool.sleepMillis(200);
            SmallTool.printTimeAndThread("厨师打饭");
            SmallTool.sleepMillis(100);
            return "番茄炒蛋 + 米饭 做好了";
        });
        SmallTool.printTimeAndThread("大熊在看新世界电视剧");
        SmallTool.printTimeAndThread(String.format("%s ,大熊开吃", cf1.join()));
    }

}

3.测试结果

        时间戳         线程ID    线程名称       消息

在这里插入图片描述

4.测试方法分析

        /**
         * supplyAsync
         * public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
         *         return asyncSupplyStage(asyncPool, supplier);
         *     }
         * Supplier:函数式接口,没有入参,只有一个返回值(对外提供数据)
         */
        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            /**
             * 当调用CompletableFuture的supplyAsync()后
             * 传入Supplier参数中的代码,会在另外一个线程中执行
             */
            SmallTool.printTimeAndThread("厨师炒红烧肉");
            SmallTool.sleepMillis(200);
            SmallTool.printTimeAndThread("厨师打饭");
            SmallTool.sleepMillis(100);
            return "番茄炒蛋 + 米饭 做好了";
        });
        SmallTool.printTimeAndThread("大熊在看新世界电视剧");
        /**
         * CompletableFuture中的join()方法返回值类型就是CompletableFuture的泛型,返回值就是supplier返回值
         * join()方法会等待任务的结束,然后返回执行结果
         */
        SmallTool.printTimeAndThread(String.format("%s ,大熊开吃", cf1.join()));

总结

以上是CompletableFuture基础使用方法,实际业务需要进一步拓展使用

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值