​​​​​​继spring@Async之后,以java8的CompletableFuture实现异步多线程任务执行,代码更加优雅。

一、CompletableFuture概述

1.提供了一种观察者模式类似的机制,可以让任务执行完成后通知监听的一方。

2.可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果。

3.实现了CompletionStage接口: 代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段。

它是Future的功能增强版,减少阻塞和轮询,可以传入回调对象,当异步任务完成或者发生异常时,自动调用回调对象的回调方法。

二、CompletableFuture作用

可以为主线程开一个分支任务(线程),专门为主线程处理耗时和费力的复杂业务。

三、核心的四个静态方法

runAsync(无返回值):

public static CompletableFuture<Void> runAsync(Runnable runnable)

public static CompletableFuture<Void> runAsync(Runnable runnable,Executor executor)

supplyAsync(有返回值):

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,Executor executor)

四、案例

//手动创建线程池,避免创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。
ExecutorService executorService = Executors.newFixedThreadPool(2);    
public List<PartVo>  PartVo() throws Exception {
        long start=System.currentTimeMillis();
        CompletableFuture<List<PartVo>> partVoInfo=CompletableFuture.supplyAsync(()-> testTask.getPartList(),executorService);
        CompletableFuture<List<CategoryVo>> listCompletableFuture = CompletableFuture.supplyAsync(() -> testTask.getCategoryList(),executorService);
       //一个新的CompletableFuture,当所有给定的Completable Future完成时完成 
CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(partVoInfo, listCompletableFuture);
        //获取结果
        List<PartVo> partsList = partVoInfo.get();
        //获取结果
        List<CategoryVo> categoryList = listCompletableFuture.get();
        long end = System.currentTimeMillis();
        System.out.println("任务全部完成,总耗时:" + (end - start) + "毫秒");
        return partsList;
    }

五、结果

使用异步多线程解决耗时和费力的复杂业务需要的时间

 不使用异步多线程解决耗时和费力的复杂业务需要的时间

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐