发布于2021-05-29 22:39 阅读(615) 评论(0) 点赞(24) 收藏(0)
今天来简单看一下CompletableFuture多线程任务异步编排
为什么需要CompletableFuture?
当多线程任务出现了相互依赖,需要按照一定的顺序执行的时候就需要用到CompletableFuture多线程任务异步编排
按照我的理解:CompletableFuture可以分为一下几种情况
1、单个任务
2、两任务的编排
3、三任务的编排
4、多任务的编排
- /**
- * runAsync无返回值
- */
- CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
- System.out.println("当前线程" + Thread.currentThread().getId());
- int i = 10 / 2;
- System.out.println("运行结果:" + i);
- }, executor);
- /**
- * supplyAsync有返回值
- * whenComplete能感知异常,能感知结果,但没办法给返回值
- * exceptionally能感知异常,不能感知结果,能给返回值。相当于,如果出现异常就返回这个值
- */
- CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
- System.out.println("当前线程" + Thread.currentThread().getId());
- int i = 10 / 0;
- System.out.println("运行结果:" + i);
- return i;
- }, executor).whenComplete((res,excption)->{
- //whenComplete虽然能得到异常信息,但是没办法修改返回值
- System.out.println("异步任务成功完成...结果是:"+res+";异常是:"+excption);
- }).exceptionally(throwable -> {
- //exceptionally能感知异常,而且能返回一个默认值,相当于,如果出现异常就返回这个值
- return 10;
- });
- /**
- * supplyAsync有返回值
- * handle能拿到返回结果,也能得到异常信息,也能修改返回值
- */
- CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
- System.out.println("当前线程" + Thread.currentThread().getId());
- int i = 10 / 4;
- System.out.println("运行结果:" + i);
- return i;
- }, executor).handle((res,excption)->{
- if(excption!=null){
- return 0;
- }else {
- return res * 2;
- }
- });
两任务组合(线程串行化)
可以是两任务的串行化,就是一个任务执行完了再执行下一个
也可以是多个任务的串行化,就是按照顺序一个个的执行
- /**
- * thenRunXXX 不能接收上一次的执行结果,也没返回值
- * .thenRunAsync(() -> {
- * System.out.println("任务2启动了...");
- * }, executor);
- */
- CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
- System.out.println("当前线程" + Thread.currentThread().getId());
- int i = 10 / 4;
- System.out.println("运行结果:" + i);
- return i;
- }, executor).thenRunAsync(() -> {
- System.out.println("任务2启动了...");
- }, executor);
- /**
- * thenAcceptXXX 能接收上一次的执行结果,但没返回值
- * .thenAcceptAsync(res->{
- * System.out.println("任务2启动了..."+res);
- * },executor);
- */
- CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
- System.out.println("当前线程" + Thread.currentThread().getId());
- int i = 10 / 4;
- System.out.println("运行结果:" + i);
- return i;
- }, executor).thenAcceptAsync(res -> {
- System.out.println("任务2启动了..." + res);
- }, executor);
- /**
- * thenApplyXXX 能接收上一次的执行结果,又可以有返回值
- * .thenApplyAsync(res -> {
- * System.out.println("任务2启动了..." + res);
- * return "hello " + res;
- * }, executor);
- */
- CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
- System.out.println("当前线程" + Thread.currentThread().getId());
- int i = 10 / 4;
- System.out.println("运行结果:" + i);
- return i;
- }, executor).thenApplyAsync(res -> {
- System.out.println("任务2启动了..." + res);
- return "hello " + res;
- }, executor);
先准备两个任务
-
- CompletableFuture<Object> future01 = CompletableFuture.supplyAsync(() -> {
- System.out.println("任务1线程" + Thread.currentThread().getId());
- int i = 10 / 4;
- System.out.println("任务1结束:");
- return i;
- }, executor);
- CompletableFuture<Object> future02 = CompletableFuture.supplyAsync(() -> {
- System.out.println("任务2线程" + Thread.currentThread().getId());
- try {
- Thread.sleep(3000);
- System.out.println("任务2结束:");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return "hello";
- }, executor);
1.1、runAfterBothAsync
任务01 任务02都完成了,再开始执行任务3,不感知任务1、2的结果的,也没返回值
- CompletableFuture<Void> future = future01.runAfterBothAsync(future02, () -> {
- System.out.println("任务3开始");
- }, executor);
1.2、thenAcceptBothAsync
任务01 任务02都完成了,再开始执行任务3,能感知到任务1、2的结果,但没返回值
- CompletableFuture<Void> future = future01.thenAcceptBothAsync(future02, (f1, f2) -> {
- System.out.println("任务3开始...得到之前的结果:f1:" + f1 + ", f2:" + f2);
- }, executor);
1.3、 thenCombineAsync
任务01 任务02都完成了,再开始执行任务3,能感知到任务1、2的结果,而且自己可以带返回值
- CompletableFuture<String> future = future01.thenCombineAsync(future02, (f1, f2) -> {
- return f1+":"+f2+":哈哈";
- }, executor);
2.1、runAfterEitherAsync
两个任务只要有一个完成,就执行任务3,不感知结果,自己没返回值
- CompletableFuture<Void> future = future01.runAfterEitherAsync(future02, () -> {
- System.out.println("任务3开始...");
- }, executor);
2.2、acceptEitherAsync
两个任务只要有一个完成,就执行任务3,感知结果,自己没返回值
- CompletableFuture<Void> future = future01.acceptEitherAsync(future02, (res) -> {
- System.out.println("任务3开始...之前的结果" + res);
- }, executor);
2.3、applyToEitherAsync
两个任务只要有一个完成,就执行任务3,感知结果,自己有返回值
- CompletableFuture<String> future = future01.applyToEitherAsync(future02, (res) -> {
- System.out.println("任务3开始...之前的结果" + res);
- return "任务3的结果...";
- }, executor);
- /**
- * 多任务组合
- */
- CompletableFuture<String> futureImg = CompletableFuture.supplyAsync(() -> {
- System.out.println("查询商品图片信息");
- return "hello.jpg";
- },executor);
-
- CompletableFuture<String> futureAttr = CompletableFuture.supplyAsync(() -> {
- System.out.println("查询商品属性信息");
- return "黑色+256G";
- },executor);
-
- CompletableFuture<String> futureDesc = CompletableFuture.supplyAsync(() -> {
- try {
- Thread.sleep(3000);
- System.out.println("查询商品介绍信息");
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return "华为...";
- },executor);
- /**
- * allOf 所有任务都执行完
- */
- CompletableFuture<Void> allOf = CompletableFuture.allOf(futureImg, futureAttr, futureDesc);
- allOf.get();//等待所有结果完成
- /**
- * anyOf 其中有一个任务执行完就可以
- */
- CompletableFuture<Object> anyOf = CompletableFuture.anyOf(futureImg, futureAttr, futureDesc);
- anyOf.get();
原文链接:https://blog.csdn.net/ju_362204801/article/details/117325220
作者:以天使的名义
链接:http://www.javaheidong.com/blog/article/207887/5f296f7b922e0858a9c6/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!