JUC并发编程 用CompletableFuture 创建异步任务

1 CompletableFuture对Future的改进

1.1 CompletableFuture为什么会出现

  • get()方法在Future计算完成之前会一直处在阻塞状态下,阻塞的方式和异步编程的设计理念相违背。
  • isDene()方法容易耗费cpu资源(cpu空转),
  • 对于真正的异步处理我们希望是可以通过传入回调函数,在Future结束时自动调用该回调函数,这样,我们就不用等待结果

1.2 CompletableFuture和CompletionStage介绍

类架构说明:

1.2.1 接口CompletionStage

代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段。
一个阶段的执行可能是被单个阶段的完成触发,也可能是由多个阶段一起触发

1.2.2 类CompletableFuture

提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合CompletableFuture的方法
它可能代表一个明确完成的Future,也可能代表一个完成阶段(CompletionStage),它支持在计算完成以后触发一些函数或执行某些动作

1.3 核心的四个静态方法,来创建一个异步任务

四个静态构造方法

对于上述Executor参数说明:若没有指定,则使用默认的ForkJoinPoolcommonPool()作为它的线程池执行异步代码,如果指定线程池,则使用我们自定义的或者特别指定的线程池执行异步代码

package com.kwfruit.thread.step01;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

@Slf4j
public class CompletableFutureBuildDemo {
    
    @SneakyThrows
    public static void main(String[] args) {
        /**
         * 无返回值
         */
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()->{
            log.debug(Thread.currentThread().getName());
            try {TimeUnit.SECONDS.sleep(1);}catch (InterruptedException e){e.printStackTrace();}
            System.out.println(Thread.currentThread().getName());
        },executorService);

        System.out.println(completableFuture1.get());
        
        /**
         * 有返回值
         */
                CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(()->{
                    log.debug(Thread.currentThread().getName());
                    try {TimeUnit.SECONDS.sleep(1);}catch (InterruptedException e){e.printStackTrace();}
                    System.out.println(Thread.currentThread().getName());
                    return "hello supplyAsync";
                });

                System.out.println(completableFuture.get());
        
        
    }
   
}
posted @ 2024-01-14 13:27  KwFruit  阅读(28)  评论(0编辑  收藏  举报