强大的CompletableFuture开启异步执行任务

2022-08-05 08:27:16

本文介绍CompletableFuture类,开启线程异步执行任务。

参考视频:这个视频讲的很好,一定要去看。。。。。。

【Java并发·03】CompletableFuture入门_哔哩哔哩_bilibili异步编程,原来可以这样简单多线程、异步 是近些年来工作中越来越常用的技术但是有好多同学都停留在 Thread 层面,没有去了解更方便的工具这是制作视屏以来的第三个作品,加入了一些搞笑的元素。希望能让你们轻轻松松学知识-本节课是 CompletableFuture 的入门课讲到了 CompletableFuture 中常用的三个APIsupplyAsync、thenCompose、thenCombihttps://www.bilibili.com/video/BV1nA411g7d2?from=search&seid=18435190904151283503&spm_id_from=333.337.0.0本文,先介绍几个方法,在介绍使用场景,再介绍如何使用,代码地址可以在视频中获取,也可以访问下面的地址:都是视频作者的,代码很好,还需要自己理解share-concurrent: Java并发编程 视屏教程 相关源码https://gitee.com/phui/share-concurrent

supplyAsync

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
        return asyncSupplyStage(asyncPool, supplier);
    }

这个是提交一个任务,开启异步执行,返回执行结果,这个方法和runAsync()---没有返回值,可以比较学习。

 使用代码:

package com.example.demo2.cusdemo.futruedemo;

import com.example.demo2.cusdemo.SmallTool;

import java.util.concurrent.CompletableFuture;


public class TestCompletable {

    public static void main(String[] args) {

        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("执行任务");
            return "任务执行结果";
        });

        System.out.println("结果===" + cf1.join());
    }
}

这个很简单,就是把要执行的任务,放到参数里就行了。

thenCompose

public <U> CompletableFuture<U> thenCompose(
        Function<? super T, ? extends CompletionStage<U>> fn) {
        return uniComposeStage(null, fn);
    }

这个可以链式写法,入参,需要传一个function。看代码

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支付,2接收支付成功后发消息,3修改状态;

代码写法

public static void main(String[] args) {
        System.out.println("订单支付进入");
        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("开始支付--调用支付接口");
            SmallTool.sleepMillis(200);
            return "支付完成";
        }).thenCompose(success -> CompletableFuture.supplyAsync(() -> {
            if("支付完成".eques(success)){
                System.out.println("发消息");
            }
            SmallTool.sleepMillis(100);
            return "发送成功";
        }));

        System.out.println("支付结束");
    }

这个例子可能不太合适,这样的话,直接让主线程自己执行也行,还可以判断支付的结果。

thenCombine

同时开启多个线程,执行任务,并将返回结果传入执行

applyToEither

多个任务,谁先返回结果,就采用哪个,

场景:询价。询问多个厂家,谁给出价格,就返回上报。

exceptionally

捕获异常。在上边的调用中,有异常发生,会在这里捕获

anyOf

任何一个返回结果就往下执行

详细介绍可以看视频。

  • 作者:wangfenglei123456
  • 原文链接:https://blog.csdn.net/wangfenglei123456/article/details/122827193
    更新时间:2022-08-05 08:27:16