CompletableFuture异步编排(两任务组合——其中一个任务执行)

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CompletableFuture异步编排(两任务组合——其中一个任务执行)相关的知识,希望对你有一定的参考价值。

目录

一、CompletableFuture源码中两任务组合其中一个任务执行的相关方法

  • CompletableFuture源码中两任务组合其中一个任务执行的相关方法

二、runAfterEither方法代码示例

  • runAfterEither方法: 两个任务有一个执行完成,不需要获取future的结果,处理任务,也没有返回值。

  • 代码示例

    package com.xz.thread.day1;
    import lombok.SneakyThrows;
    import java.util.concurrent.*;
    /**
     * @description: 两任务组合(一个任务执行)
     *              runAfterEither 两个任务有一个执行完成,不需要获取future的结果,处理任务,也没有返回值。
     * @author: xz
     * @create: 2022-08-23
     */
    public class Test14 
        /**
         * 定义线程池
         */
        public static ExecutorService service = Executors.newFixedThreadPool(3);
    
        @SneakyThrows
        public static void main(String[] args)  
            System.out.println("main start ...");
    
            CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 
                System.out.println("开启异步任务1...");
                int i = 10 / 1;
                return i;
            , service);
    
            CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> 
                try 
                    Thread.sleep(1000);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
                System.out.println("开启异步任务2...");
                return "hello world!";
            , service);
    
            future1.runAfterEitherAsync(future2, () -> 
                System.out.println("任务3 启动了....");
            , service);
    
            System.out.println("main end ...");
        
    
    
  • 输出结果

  • 由上述输出结果可知,任务1执行完成后,任务3不需要等待任务2执行完成,即可启动任务3。但是使用runAfterEitherAsync不能感知任务的返回值,自身也无返回值。

三、acceptEither方法代码示例

  • acceptEither方法: 两个任务有一个执行完成,获取它的返回值,处理任务,没有新的返回值。

  • 代码示例

    package com.xz.thread.day1;
    import lombok.SneakyThrows;
    import java.util.concurrent.*;
    /**
     * @description: 两任务组合(一个任务执行)
     *              acceptEither 两个任务有一个执行完成,获取它的返回值,处理任务,没有新的返回值。
     * @author: xz
     * @create: 2022-08-23
     */
    public class Test15 
        /**
         * 定义线程池
         */
        public static ExecutorService service = Executors.newFixedThreadPool(5);
    
        @SneakyThrows
        public static void main(String[] args) 
            System.out.println("main start ...");
    
            CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 
                System.out.println("开启异步任务1...");
                int i = 10 / 1;
                return i;
            , service);
    
            CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 
                try 
                    Thread.sleep(1000);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
                System.out.println("开启异步任务2...");
                return 20;
            , service);
    
            future1.acceptEitherAsync(future2, (res) -> 
                System.out.println("任务3 启动了...., 任务结果是:" + res);
            , service);
    
            System.out.println("main end ...");
        
    
    
  • 输出结果

  • 由上述输出结果可知,可以获取任务1的执行结果,但不返回执行结果。

四、applyToEither方法代码示例

  • applyToEither方法: 两个任务有一个任务执行完成,获取它的返回值,处理任务并有新的返回值。

  • 代码示例

    package com.xz.thread.day1;
    import lombok.SneakyThrows;
    import java.util.concurrent.*;
    /**
     * @description:
     *          ApplyToEither 两个任务有一个任务执行完成,获取它的返回值,处理任务并有新的返回值。
     * @author: xz
     * @create: 2022-08-23
     */
    public class Test16 
        /**
         * 定义线程池
         */
        public static ExecutorService service = Executors.newFixedThreadPool(3);
    
        @SneakyThrows
        public static void main(String[] args)
            System.out.println("main start ...");
    
            CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 
                System.out.println("开启异步任务1...");
                int i = 10 / 1;
                return i;
            , service);
    
            CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 
                try 
                    Thread.sleep(1000);
                 catch (InterruptedException e) 
                    e.printStackTrace();
                
                System.out.println("开启异步任务2...");
                return 20;
            , service);
    
            CompletableFuture<String> stringCompletableFuture = future1.applyToEitherAsync(future2, (res) -> 
                System.out.println("任务3 启动了...., 上个任务结果是:" + res);
                return "我是任务3的返回值, 上个任务的执行结果是:" + res;
            , service);
            System.out.println("======"+stringCompletableFuture.get());
    
            System.out.println("main end ...");
        
    
    
  • 输出结果

  • 由上述输出结果可知,可以获取任务1的执行结果,并且返回执行结果。

以上是关于CompletableFuture异步编排(两任务组合——其中一个任务执行)的主要内容,如果未能解决你的问题,请参考以下文章

CompletableFuture异步编排(两任务组合——其中一个任务执行)

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

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

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

CompletableFuture异步编排(多任务组合)

CompletableFuture异步编排(多任务组合)