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

本文介绍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

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

详细介绍可以看视频。

CompletableFutureJava 8引入的一个类,用于支持异步编程和处理异步任务的结果。它提供了一种简洁而强大的方式来开启异步线程。 要使用CompletableFuture开启异步线程,可以按照以下步骤进行操作: 1. 创建一个CompletableFuture对象:可以使用CompletableFuture的静态方法`supplyAsync()`或`runAsync()`来创建一个CompletableFuture对象。`supplyAsync()`用于执行有返回值的异步任务,`runAsync()`用于执行没有返回值的异步任务。 2. 定义异步任务:使用`thenApply()`、`thenAccept()`或`thenRun()`等方法来定义异步任务。这些方法接受一个函数作为参数,用于处理异步任务的结果。 3. 处理异步任务的结果:可以使用`get()`方法来获取异步任务的结果,或者使用`join()`方法来等待异步任务完成并获取结果。也可以使用`thenApply()`、`thenAccept()`或`thenRun()`等方法来处理异步任务的结果。 下面是一个示例代码,演示了如何使用CompletableFuture开启异步线程: ```java import java.util.concurrent.CompletableFuture; public class CompletableFutureExample { public static void main(String[] args) { // 创建CompletableFuture对象,并开启异步线程执行任务 CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { // 异步任务的逻辑 return "Hello, CompletableFuture!"; }); // 处理异步任务的结果 future.thenApply(result -> { // 处理异步任务的结果 System.out.println(result); return result.toUpperCase(); }).thenAccept(result -> { // 处理上一步的结果 System.out.println("Uppercase result: " + result); }); // 等待异步任务完成 future.join(); } } ``` 以上代码中,首先使用`supplyAsync()`方法创建了一个CompletableFuture对象,并在其中定义了一个异步任务,该任务返回字符串"Hello, CompletableFuture!"。然后使用`thenApply()`方法处理异步任务的结果,将结果转换为大写并输出。最后使用`join()`方法等待异步任务完成。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值