CompletableFuture异步编排(线程串行化代码示例)

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CompletableFuture异步编排(线程串行化代码示例)相关的知识,希望对你有一定的参考价值。

目录

一、CompletableFuture源码中线程串行化方法

  • 在CompletableFuture类中有以下方法:

二、thenApply方法代码示例

  • thenApply方法:当一个线程依赖另一个线程时,获取上一个任务返回结果,并返回当前任务的返回值。

  • 代码示例

    package com.xz.thread.day1;
    
    import lombok.SneakyThrows;
    import java.util.concurrent.*;
    /**
     * @description: 线程串行化
     *              thenApply方法:当一个线程依赖另一个线程时,获取上一个任务返回结果,并返回当前任务的返回值。
     * @author: xz
     * @create: 2022-08-23
     */
    public class Test8 
        /**
         * 定义线程池
         */
        public static ExecutorService service = Executors.newFixedThreadPool(5);
    
        @SneakyThrows
        public static void main(String[] args) throws ExecutionException, InterruptedException 
            System.out.println("main start ...");
    
            CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 
                System.out.println("开启异步任务...");
                int i = 10 % 2;
                return i;
            , service).thenApplyAsync((res) -> 
                System.out.println("任务2启动了... 上一步的结果是:" + res);
                return res + 2;
            , service);
    
            System.out.println("获取异步任务最终返回值:" + future.get());
            System.out.println("main end ...");
        
    
    
  • 输出结果

三、thenAccept方法代码示例

  • thenAccept方法:接收任务的处理结果,并消费处理结果,无返回结果。

  • 代码示例

    package com.xz.thread.day1;
    import lombok.SneakyThrows;
    import java.util.concurrent.*;
    /**
     * @description: 线程串行化
     *              thenAccept方法:消费处理结果,接收任务的处理结果,并消费处理,无返回结果。
     * @author: xz
     * @create: 2022-08-23
     */
    public class Test9 
        /**
         * 定义线程池
         */
        public static ExecutorService service = Executors.newFixedThreadPool(3);
    
        @SneakyThrows
        public static void main(String[] args)
            System.out.println("main start ...");
    
            CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> 
                System.out.println("开启异步任务...");
                int i = 10 % 2;
                return i;
            , service).thenAcceptAsync((res) -> 
                System.out.println("任务2启动了... 上一步的结果是:" + res);
            , service);
    
            System.out.println("获取异步任务返回值:" + future.get());
            System.out.println("main end ...");
        
    
    
  • 输出结果

四、thenRun方法代码示例

  • thenRun方法:只要上面的任务执行完成,就开始执行thenRun,只是处理完任务后,执行thenRun的后续操作。获取不到上个任务的执行结果,无返回值。

  • 代码示例

    package com.xz.thread.day1;
    import lombok.SneakyThrows;
    import java.util.concurrent.*;
    /**
     * @description: 线程串行化
     *              thenRun方法:获取不到上个任务的执行结果,无返回值。
     * @author: xz
     * @create: 2022-08-23
     */
    public class Test10 
        /**
         * 定义线程池
         */
        public static ExecutorService service = Executors.newFixedThreadPool(3);
    
        @SneakyThrows
        public static void main(String[] args) throws ExecutionException, InterruptedException 
            System.out.println("main start ...");
    
            CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> 
                System.out.println("开启异步任务...");
                int i = 10 % 2;
                return i;
            , service).thenRun(() -> 
                System.out.println("任务2启动了...");
            );
    
            System.out.println("获取异步任务返回值:" + future.get());
            System.out.println("main end ...");
        
    
    
  • 输出结果

以上是关于CompletableFuture异步编排(线程串行化代码示例)的主要内容,如果未能解决你的问题,请参考以下文章

CompletableFuture异步编排(线程串行化代码示例)

CompletableFuture异步编排(线程串行化代码示例)

CompletableFuture异步编排(线程串行化代码示例)

线程异步编排并行(CompletableFuture)

线程异步编排并行(CompletableFuture)

CompletableFuture 异步编排