您当前的位置: 首页 > 

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

CompletableFuture异步编排(两任务组合——两个任务必须都完成才触发另一个任务 )

小志的博客 发布时间:2022-08-23 22:54:21 ,浏览量:0

目录
    • 一、CompletableFuture源码中两任务组合方法
    • 二、runAfterBoth方法代码示例
    • 三、thenAcceptBothAsync方法代码示例
    • 四、thenCombine方法代码示例

一、CompletableFuture源码中两任务组合方法
  • CompletableFuture源码中两任务组合相关方法

    在这里插入图片描述在这里插入图片描述 在这里插入图片描述

二、runAfterBoth方法代码示例
  • runAfterBoth方法: 没有返回值,入参CompletionStage、action; 第一个异步任务.runAfterBoth(第二个异步任务,第三个异步任务)

  • 代码示例

    package com.xz.thread.day1;
    import lombok.SneakyThrows;
    
    import java.util.concurrent.*;
    /**
     * @description: 两任务组合(两个任务都执行)
     *              runAfterBoth方法: 没有返回值,入参CompletionStage、action;
     *              第一个异步任务.runAfterBoth(第二个异步任务,第三个异步任务)
     * @author: xz
     * @create: 2022-08-23
     */
    public class Test11 {
        /**
         * 定义线程池
         */
        public static ExecutorService service = Executors.newFixedThreadPool(3);
    
        @SneakyThrows
        public static void main(String[] args) {
            System.out.println("main start ...");
    
            CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {
                System.out.println("开启异步任务1...");
                int i = 10 / 1;
                return i;
            }, service);
    
            CompletableFuture future2 = CompletableFuture.supplyAsync(() -> {
                System.out.println("开启异步任务2...");
                return "hello world!";
            }, service);
    
            future1.runAfterBothAsync(future2, () -> {
                System.out.println("开启任务3....");
            }, service);
    
            System.out.println("main end ...");
        }
    }
    
  • 输出结果 在这里插入图片描述

  • 有上述输出结果可知,任务3是在任务1和任务2执行完成后,才执行的。

三、thenAcceptBothAsync方法代码示例
  • thenAcceptBothAsync方法: 可以获取两个任务的返回值;thenAcceptBoth可以感知任务1和任务2的返回值,但是thenAcceptBoth没有返回值。

  • 代码示例

    package com.xz.thread.day1;
    import lombok.SneakyThrows;
    import java.util.concurrent.*;
    /**
     * @description: 两任务组合(两个任务都执行)
     *              thenAcceptBoth方法:可以获取两个任务的返回值。
     *              thenAcceptBoth可以感知任务1和任务2的返回值,但是thenAcceptBoth没有返回值。
     * @author: xz
     * @create: 2022-08-23
     */
    public class Test12 {
        /**
         * 定义线程池
         */
        public static ExecutorService service = Executors.newFixedThreadPool(3);
    
        @SneakyThrows
        public static void main(String[] args) {
            System.out.println("main start ...");
    
            CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {
                System.out.println("开启异步任务1...");
                int i = 10 / 1;
                return i;
            }, service);
    
            CompletableFuture future2 = CompletableFuture.supplyAsync(() -> {
                System.out.println("开启异步任务2...");
                return "hello world!";
            }, service);
    
            future1.thenAcceptBothAsync(future2, (res1, res2) -> {
                System.out.println("任务3 启动了.... 任务1的返回值:" + res1 + " 任务2的返回值:" + res2);
            }, service);
    
            //System.out.println("获取异步任务最终返回值:" + future.get());
            System.out.println("main end ...");
        }
    }
    
  • 输出结果 在这里插入图片描述

  • 有上述输出结果可知,任务3在任务1和任务2执行后执行了,并获取了任务1和任务2的返回值。

四、thenCombine方法代码示例
  • thenCombine方法: 可以获取两个任务的返回值,并可以将任务三结果返回。

  • 代码示例

    package com.xz.thread.day1;
    import lombok.SneakyThrows;
    import java.util.concurrent.*;
    /**
     * @description: 两任务组合(两个任务都执行)
     *              thenCombine 可以获取两个任务的返回值,并可以将任务三结果返回。
     * @author: xz
     * @create: 2022-08-23
     */
    public class Test13 {
        /**
         * 定义线程池
         */
        public static ExecutorService service = Executors.newFixedThreadPool(3);
    
        @SneakyThrows
        public static void main(String[] args) {
            System.out.println("main start ...");
    
            CompletableFuture future1 = CompletableFuture.supplyAsync(() -> {
                System.out.println("开启异步任务1...");
                int i = 10 / 1;
                return i;
            }, service);
    
            CompletableFuture future2 = CompletableFuture.supplyAsync(() -> {
                System.out.println("开启异步任务2...");
                return "hello world!";
            }, service);
    
            CompletableFuture stringCompletableFuture = future1.thenCombineAsync(future2, (res1, res2) -> {
                System.out.println("任务3 启动了.... 任务1的返回值:" + res1 + " 任务2的返回值:" + res2);
                return res1 + "-->" + res2;
            }, service);
            System.out.println("获取异步任务最终返回值:" + stringCompletableFuture.get());
    
            System.out.println("main end ...");
        }
    
    }
    
  • 输出结果 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0497s