初探 CompletableFuture Java8新的异步编程方式

2024-06-01 05:18

本文主要是介绍初探 CompletableFuture Java8新的异步编程方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 序言

       由于项目中想获取多个异步线程的状态,并判断其是否都执行完成,若执行完成后则做后续操作,经同事提醒java8 中CompletableFuture这个可以完美解决项目问题,故借此机会学习了下,记录下涉及到的知识点,以便后期回顾。

  1. CompletableFuture

        2.1 Async结尾的方法都是可以异步执行的,如果指定了线程池,会在指定的线程池中执行,如果没有指定,默认会ForkJoinPool.commonPool()中执行。

     runAsync方法:它以Runnabel函数式接口类型为参数,所以CompletableFuture的计算结果为空。

    supplyAsync方法以Supplier<U>函数式接口类型为参数,CompletableFuture的计算结果类型为U。

方法   描述
static CompletableFuture<Void> runAsync(Runnable runnable)返回一个新的CompletableFuture,它在运行给定操作后由运行在 ForkJoinPool.commonPool()中的任务 异步完成
static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)返回一个新的CompletableFuture,它在运行给定操作后在给定的线程池中运行的任务异步完成异步完成
static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)返回一个新的CompletableFuture,它通过在 ForkJoinPool.commonPool()中运行的任务与通过调用给定的供应商获得的值 异步完成
static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)返回一个新的CompletableFuture,由给定执行器中运行的任务异步完成,并通过调用给定的供应商获得的值
  //1. 返回一个新的CompletableFuture,它在运行给定操作后由运行在 ForkJoinPool.commonPool()中的任务 异步完成。CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(()-> {System.out.println(" completableFuture1 is not nothing");});//2. 返回一个新的CompletableFuture,它在运行给定操作后在给定的线程池中运行的任务异步完成异步完成。CompletableFuture<Void> completableFuture2 = CompletableFuture.runAsync(()-> {System.out.println(" completableFuture2 is not nothing");},Executors.newSingleThreadExecutor());//3. 返回一个新的CompletableFuture,它通过在 ForkJoinPool.commonPool()中运行的任务与通过调用给定的供应商获得的值 异步完成。CompletableFuture<Object> completableFuture3 = CompletableFuture.supplyAsync(()-> {return "hello completableFuture3";});//4. 返回一个新的CompletableFuture,由给定执行器中运行的任务异步完成,并通过调用给定的供应商获得的值。CompletableFuture<Object> completableFuture4 = CompletableFuture.supplyAsync(()-> {return "hello completableFuture4";},Executors.newSingleThreadExecutor());System.out.println(completableFuture3.get());System.out.println(completableFuture4.get());

   2.2 allOf 、 anyOf

方法描述
static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs)返回一个新的CompletableFuture,当所有给定的CompletableFutures完成时,完成。 
 执行完所有提交任务后进行后面的操作,无返回值
static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs)  返回一个新的CompletableFuture,当任何一个给定的CompletableFutures完成时,完成相同的结果。用于有返回值的,当任一执行完立即返回结果
 CompletableFuture<Object> completableFuture5 = CompletableFuture.supplyAsync(()-> {return "hello completableFuture5";});CompletableFuture<Object> completableFuture6 = CompletableFuture.supplyAsync(()-> {return "hello completableFuture6";},Executors.newSingleThreadExecutor());// allOf 若后面没有加join(),那么void1和void2将异步执行,这里不会阻塞,也就拿不到执行结果CompletableFuture.allOf(completableFuture5,completableFuture6).thenRun(()->{System.out.println("hello allof");}).join();List<CompletableFuture> completableFutureList = new ArrayList<>();completableFutureList.add(completableFuture5);completableFutureList.add(completableFuture6);// 方式一// completableFuture5 和 completableFuture6都执行完成后,输出对应的结果CompletableFuture<Void> res = CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()]));CompletableFuture<List<Object>> result = res.thenApply(v ->{return  completableFutureList.stream().map(CompletableFuture::join).collect(Collectors.toList());});System.out.println(result.get());// 方式二List<Object> result2 = Stream.of(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()])).map(CompletableFuture::join).collect(Collectors.toList());System.out.println(result2);// completableFuture5 和 completableFuture6 随机的,只要某个执行完成就会结束并返回结果。CompletableFuture<Object> anyof = CompletableFuture.anyOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()]));System.out.println(anyof.get());

2.3 CompletableFuture 异常处理

CompletableFuture在运行时如果遇到异常,可以使用get()并抛出异常进行处理,但这并不是一个最好的方法。CompletableFuture本身也提供了几种方式来处理异常

方法描述

exceptionally(Function<Throwable,? extends T> fn)

只有当CompletableFuture抛出异常的时候,才会触发这个exceptionally的计算,调用function计算值。
 CompletableFuture<String> completableFuture7 = CompletableFuture.supplyAsync(()-> {int m = 1/0;return "hello completableFuture7";}).exceptionally(ex->{return ex.getMessage();});System.out.println(completableFuture7.get());

 

这篇关于初探 CompletableFuture Java8新的异步编程方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020078

相关文章

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN