java 快速实现异步调用的操作方法

 更新时间:2023年07月31日 14:32:31   作者:SoftwareDevOps  
这篇文章主要介绍了java 如何快速实现异步调用方法,今天我们就来了解下 CompletableFuture,它Java 8引入的一种功能强大的异步编程工具,可以用于实现复杂的异步操作和处理链式的异步任务,需要的朋友可以参考下

什么是异步编程

在实现异步调用之前,我们先了解一下,什么是异步编程?什么场景下适用等等情况。

我们都知道,在传统的同步编程中,当一个操作开始执行时,程序会阻塞并等待该操作完成,然后才能继续执行后续代码。这种阻塞等待的方式可能会导致程序响应性能下降,因为在等待的过程中无法同时处理其他任务。这种显而易见的,在某种耗时的场景下,就显得无用了,甚至很影响体验。

如文件读写、网络请求或计算密集型任务,再如人脸融合特效等等,都是耗时的操作,这个时候,我们就需要异步编程了。

异步编程则不会阻塞程序的执行,它将耗时的操作提交给后台线程或其他执行环境,并立即返回,使得程序可以继续执行其他任务。当耗时操作完成后,会通过回调、事件或者轮询等方式通知主线程,主线程再去处理操作结果或执行相应的回调函数。

CompletableFuture

今天我们就来了解下 CompletableFuture,它Java 8引入的一种功能强大的异步编程工具,可以用于实现复杂的异步操作和处理链式的异步任务。

在这里插入图片描述

从这个JDK里,可以看出,它既实现了 Future 接口,拥有 Future 所有的特性,比如可以使用 get() 方法获取返回值等。

也实现了CompletionStage接口,提供了丰富的方法来管理异步任务的执行和处理任务结果。并且这些接口多达40多个,完全足够我们日常所使用了。

1. supplyAsync

 CompletableFuture<T> supplyAsync(Supplier<? extends T> supplier)

该方法接受一个Supplier函数式接口作为参数,用于执行一个有返回值的异步任务。返回一个CompletableFuture对象,可以用于获取异步任务的执行结果。

参数:

Supplier:一个无参的函数式接口,用于提供异步任务的结果。

2. runAsync

CompletableFuture<Void> runAsync(Runnable runnable)

该方法接受一个Runnable函数式接口作为参数,用于执行一个无返回值的异步任务。返回一个CompletableFuture对象,可以用于等待异步任务完成。

参数:Runnable:一个无参的函数式接口,用于执行异步任务。

3. thenApply

CompletableFuture<T> thenApply(Function<? super T,? extends U> function)

该方法接受一个Function函数式接口作为参数,用于对CompletableFuture的结果进行处理,并返回新的CompletableFuture对象。

参数:Function:一个带有一个参数的函数式接口,用于对异步任务的结果进行转换或处理。

4. thenAccept

CompletableFuture<Void> thenAccept(Consumer<? super T> consumer)

该方法接受一个Consumer函数式接口作为参数,用于对CompletableFuture的结果进行消费,没有返回值

参数:

Consumer:一个带有一个参数的函数式接口,用于消费异步任务的结果。

5. thenRun

CompletableFuture<Void> thenRun(Runnable action)

该方法接受一个Runnable函数式接口作为参数,用于在CompletableFuture的结果完成后执行指定的操作,没有返回值。

参数:BiFunction:一个带有两个参数的函数式接口,用于合并两个CompletableFuture的结果。

6. thenCombine

CompletableFuture<U> thenCombine(CompletionStage<? extends V> other, BiFunction<? super T,? super U,? extends V> fn)

该方法接受一个CompletionStage对象和一个BiFunction函数式接口作为参数,用于等待当前CompletableFuture和另一个CompletionStage对象都完成后,将其结果进行组合处理,并返回新的CompletableFuture对象。

参数:

CompletionStage:代表一个异步任务的执行状态。

返回值:

  • CompletableFuture<T>:表示一个异步任务的结果,可以通过该对象获取异步任务的执行结果。
  • CompletableFuture<Void>:表示一个异步任务的结果,没有返回值。

java 演示

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 使用supplyAsync方法创建一个CompletableFuture对象来执行有返回值的异步任务
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("异步任务正在执行");
            return 100;
        });
        // 使用thenApply方法对异步任务的结果进行处理,并返回新的CompletableFuture对象
        CompletableFuture<String> processedFuture = future.thenApply(result -> {
            System.out.println("对异步任务结果进行处理");
            return "处理后的结果:" + result * 2;
        });
        // 使用get方法阻塞当前线程,并获取异步任务的执行结果
        String result = processedFuture.get();
        System.out.println(result);
    }
}

异步任务正在执行
对异步任务结果进行处理
处理后的结果:200

到此这篇关于java 如何快速实现异步调用方法的文章就介绍到这了,更多相关java异步调用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 反射机制原理与用法详解

    Java 反射机制原理与用法详解

    这篇文章主要介绍了Java 反射机制原理与用法,结合实例形式详细分析了Java反射机制的相关概念、原理、基本使用方法及操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Java8中利用stream对map集合进行过滤的方法

    Java8中利用stream对map集合进行过滤的方法

    这篇文章主要给大家介绍了关于Java8中利用stream对map集合进行过滤的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 如何获取包下所有类中的注解的值(java工具类)

    如何获取包下所有类中的注解的值(java工具类)

    这篇文章主要介绍了如何获取包下所有类中的注解的值 (java工具类),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot自动配置实现流程详细分析

    SpringBoot自动配置实现流程详细分析

    这篇文章主要介绍了SpringBoot自动配置原理分析,SpringBoot是我们经常使用的框架,那么你能不能针对SpringBoot实现自动配置做一个详细的介绍。如果可以的话,能不能画一下实现自动配置的流程图。牵扯到哪些关键类,以及哪些关键点
    2022-12-12
  • Java按照List内存储的对象的某个字段进行排序的实例

    Java按照List内存储的对象的某个字段进行排序的实例

    下面小编就为大家带来一篇Java按照List内存储的对象的某个字段进行排序的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Springboot中集成Swagger2框架的方法

    Springboot中集成Swagger2框架的方法

    这篇文章主要介绍了Springboot中集成Swagger2框架的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • 例题详解Java dfs与记忆化搜索和分治递归算法的使用

    例题详解Java dfs与记忆化搜索和分治递归算法的使用

    递归指函数调用自身。常用的递归算法有dfs(深度优先搜索)、记忆化搜索和分治,接下来将用几个算法题来带你熟练掌握它
    2022-04-04
  • 简单实现Java验证码功能

    简单实现Java验证码功能

    这篇文章主要为大家详细介绍了简单实现Java验证码功能的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • SpringBoot如何通过Feign调用传递Header中参数

    SpringBoot如何通过Feign调用传递Header中参数

    这篇文章主要介绍了SpringBoot通过Feign调用传递Header中参数,本文给大家分享两种解决方案给大家详细讲解,需要的朋友可以参考下
    2023-04-04
  • JAVA DOC如何生成标准的JAVA API文档详解

    JAVA DOC如何生成标准的JAVA API文档详解

    这篇文章主要给大家介绍了关于JAVA DOC如何生成标准的JAVA API文档的相关资料,Javadoc是Sun公司提供的一种工具,它可以从程序源代码中抽取类、方法、成员等注释,然后形成一个和源代码配套的API帮助文档,需要的朋友可以参考下
    2024-06-06

最新评论