当前位置: 首页 > article >正文

30分钟入门CompletableFuture并发工具使用

快速学习基本方法,然后30分钟直接学会CompletableFuture的使用

异步处理:supplyAsync()

分析Supplier接口

首先我们看看Supplier接口

这是一个函数式接口,没有入参,只有一个返回值

我们这段代码会在另一个线程执行然后return

public class Main {
    public static void main(String[] args) {
        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            //业务逻辑
            return "任务结果";
        });
    }
}

等待异步结束:join()

我们等待异步线程执行结束

public class Main {
    public static void main(String[] args) {
       

        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            //业务逻辑
            return "任务结果";
        });
        //我们的主线程等待异步线程执行结束才往下执行
        cf1.join();
    }
}

执行完任务1再开启任务2:thenCompose()

我们thenCompose()就是执行完上一个任务再开启下一个任务

我们的前一个异步操作的结果作为下一个异步操作结果的输入

我们的这个dish变量,其实就是个变量名,随便写都行,就是thenCompose()上一个任务的执行结果

我们可以传到下一个任务中去


public class Main {
    public static void main(String[] args) {

        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            //执行任务1
            return "任务1的结果";
        }).thenCompose(dish -> CompletableFuture.supplyAsync(() -> {
            //执行任务2
            return "任务2的结果";
        }));

    }
}

任务1和任务2同时执行:thenCombine()

我们任务1和任务2同时执行,然后我们会把两个任务执行的结果组合起来

然后return返回

public class Main {
    public static void main(String[] args) {


        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            //执行任务1
            return "任务1的结果";
        }).thenCombine(CompletableFuture.supplyAsync(() -> {
            //执行任务2
            return "任务2的结果";
        }), (a, b) -> {
            return String.format("%s + %s 好了", a, b;
        });


    }
}

异步线程结束后,再对异步线程结果做处理:thenApply()

和thenCompose()的区别:thenCompose()是开启另一个异步线程执行,而thenApply()的目的是对异步线程的结果做处理

也就是说thenApply是进一步处理结果的,不会再开启一个新的异步线程

public class Main {
    public static void main(String[] args) {

        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            return "500";
        }).thenApply(money -> {
            return String.format("%s元发票", money);
        });


    }
}

thenApplyAsync()

和thenCompose()差不多,省略


任务1和任务2谁先结束谁先返回:applyToEither()

任务1和任务2,哪一个任务先结束,哪一个任务就先返回

我们的这个方法的第二个参数,是对结果进行处理

result -> result,例如我们的结果是result,我们不做处理所以还是返回result

结果要变化或者调用函数变化可以自己加

public class _02_applyToEither {
    public static void main(String[] args) {


        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            //执行任务1
            return "任务1的结果";
        }).applyToEither(CompletableFuture.supplyAsync(() -> {
            //执行任务2
            return "任务2的结果";
        }), result -> result);


    }
}
public class _02_applyToEither {
    public static void main(String[] args) {


        CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            //执行任务1
            return "任务1的结果";
        }).applyToEither(CompletableFuture.supplyAsync(() -> {
            //执行任务2
            return "任务2的结果";
        }), result -> {
            //修改结果逻辑
        });


    }
}

处理异步线程的异常:exceptionally()

public class _02_applyToEither {
    public static void main(String[] args) {


 CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
            //执行任务1
            return "任务1的结果";
}).exceptionally(e -> {
    //处理报错
    return "报错";
});


    }
}

等待所有异步线程执行完:allOf()

import java.util.concurrent.CompletableFuture;

public class AllOfExample {
    public static void main(String[] args) throws Exception {
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 1);
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 2);
        CompletableFuture<Void> allOf = CompletableFuture.allOf(future1, future2);
        allOf.get();// 等待所有任务完成
        System.out.println("任务1结果: " + future1.get());
        System.out.println("任务2结果: " + future2.get());
    }
}

进一步简洁使用

我们可以用一个CompletableFuture【】数组,然后allOf()统一进行管理

import java.util.concurrent.CompletableFuture;

public class AllOfExample {
    public static void main(String[] args) throws Exception {
        CompletableFuture<Integer>[] cf = new CompletableFuture[2];
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 1);
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 2);
        cf[0] = future1;
        cf[1] = future2;
        CompletableFuture<Void> allOf = CompletableFuture.allOf(cf);
        allOf.get();// 等待所有任务完成
        System.out.println("任务1结果: " + future1.get());
        System.out.println("任务2结果: " + future2.get());
    }
}


等待其中一个异步线程执行完:anyOf()

import java.util.concurrent.CompletableFuture;

public class AllOfExample {
    public static void main(String[] args) throws Exception {
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 1);
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 2);
        CompletableFuture<Object> anyOf = CompletableFuture.anyOf(future1, future2);
        Object first=allOf.get();// 第一个执行完的任务的任务结果
        
        System.out.println("任务1结果: " + future1.get());
        System.out.println("任务2结果: " + future2.get());
        System.out.println(first);
    }
}


http://www.kler.cn/a/531047.html

相关文章:

  • 八. Spring Boot2 整合连接 Redis(超详细剖析)
  • 对象的实例化、内存布局与访问定位
  • 鸟哥Linux私房菜笔记(三)
  • Spring WebFlux揭秘:下一代响应式编程框架,与Spring MVC有何不同?
  • C++模板编程——可变参函数模板之折叠表达式
  • 交易股指期货有什么技巧吗?
  • 【漫话机器学习系列】077.范数惩罚是如何起作用的(How Norm Penalties Work)
  • mac执行brew services list时,无法连接GitHub
  • 谷歌Titans模型论文解析,Transformer迎来变革拐点——DeepSeek能否“接招”?
  • 七. Redis 当中 Jedis 的详细刨析与使用
  • 【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具03
  • 【建站】专栏目录
  • 51c视觉~CV~合集10
  • Windows图形界面(GUI)-QT-C/C++ - QT Stacked Widget
  • 运维自动化工具集:构建高效运维体系的密钥
  • 浏览器模块化难题
  • 解决vscode扩展插件开发webview中的请求跨域问题
  • 【前端】ES6模块化
  • 大模型综合性能考题汇总
  • 【PyQt】keyPressEvent键盘按压事件无响应
  • 单行函数与聚合函数
  • Windows 安装Linux子系统
  • Autosar CP RTE规范解读之RTE与VFB以及RTE API关系解析
  • 【机器学习篇】K-Means 算法详解:从理论到实践的全面解析
  • 高阶开发基础——快速入门C++并发编程3
  • 掌握 HTML5 多媒体标签:如何在所有浏览器中顺利嵌入视频与音频