CompletableFuture:Java中的异步编程利器

这篇具有很好参考价值的文章主要介绍了CompletableFuture:Java中的异步编程利器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

在秋招的面试中,面试官问了很多关于异步编程相关的知识点,朋友最近也和我聊到了这个话题,因此今天咱们来讨论讨论这个知识点!

随着现代软件系统的日益复杂,对于非阻塞性和响应性的需求也在不断增加。Java为我们提供了多种工具和技术来满足这些需求,其中CompletableFuture便是Java 8中引入的一种强大的异步编程工具。
CompletableFuture:Java中的异步编程利器,秋招总结&小白入坑Java,java,开发语言

CompletableFuture的底层机制

在深入了解CompletableFuture之前,我们首先需要理解什么是Future(在这里不是未来的意思哦😁)。

在Java中,Future代表一个异步计算的结果。这意味着我们可以使用Future来查询计算是否完成(isDone()),或者阻塞当前线程,直到计算完成并返回结果(get())。然而,Future并不提供直接的方法来处理计算完成后的结果或异常。

这就是CompletableFuture的闪亮之处。与Future不同,CompletableFuture实现了CompletionStage接口,这意味着它提供了更为丰富和灵活的API来处理异步计算的结果或异常。例如,我们可以使用thenApply(), thenAccept(), thenRun()和exceptionally()等方法来添加回调函数。

CompletableFuture的核心工作流程

当我们创建一个CompletableFuture实例时,它代表了一个尚未完成的异步计算。这个异步计算可以在另一个线程中执行,也可以由线程池执行。一旦计算完成,结果就会被存储在CompletableFuture实例中。任何等待这个结果的线程(通过调用get()或相关方法)都会被唤醒并返回结果。

除此,我们还可以链式地添加多个回调函数来处理结果或异常。这些回调函数只会在计算完成后被调用,并且它们自己也是异步执行的。这意味着我们可以避免阻塞主线程,同时确保代码的逻辑连续性

CompletableFuture:Java中的异步编程利器,秋招总结&小白入坑Java,java,开发语言

CompletableFuture应用场景

下面介绍一下CompletableFuture在项目中的几个经典应用场景。

非阻塞性I/O操作

当我们执行I/O密集型任务,比如读取文件、网络请求,使用CompletableFuture可以确保主线程不会被阻塞,从而提高应用的响应性。

public class AsyncFileIO {  
    public static void main(String[] args) throws Exception {  
        CompletableFuture<String> fileContentFuture = CompletableFuture.supplyAsync(() -> {  
            try {  
                return new String(Files.readAllBytes(Paths.get("xiaowei.txt")));  
            } catch (Exception e) {  
                throw new RuntimeException("Error reading file", e);  
            }  
        });  
  
        // 在文件读取完成前,可以执行其他操作...  
        // ...  其他操作
        // 等待文件读取完成并处理内容  
        String fileContent = fileContentFuture.get();  
        System.out.println("File content: " + fileContent);  
    }  
}

用于并行计算

对于可以并行处理的任务,你可以创建多个CompletableFuture实例并在不同的线程或线程池中执行它们。然后,你可以使用allOf()或anyOf()方法来等待所有或部分任务完成。

public class CompletableFutureDemo {  
    public static void main(String[] args) {  
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> compute(100));  
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> compute(200));  
  
        CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + result2);  
        Integer sum = combinedFuture.join(); // 等待所有future完成并获取结果  
        System.out.println("Sum: " + sum);  
    }  
  
    private static int compute(int value) {  
        // 模拟长时间计算...  
        return Stream.iterate(0, i -> i + 1)  
                     .limit(value)  
                     .mapToInt(i -> i)  
                     .sum();  
    }  
}

组合异步操作

有时我们可能需要等待多个异步操作完成后才能继续。使用CompletableFuture.allOf()可以轻松实现这一点。例如:

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");  
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");  
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);  
combinedFuture.join(); // 等待所有future完成

错误处理

与传统的Future相比,CompletableFuture提供了更为优雅的错误处理方式。你可以使用exceptionally()方法来处理异步操作中抛出的异常。例如:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {  
    // 可能抛出异常的长时间运行的任务  
    return someLongRunningTask();  
}).exceptionally(ex -> {  
    // 处理异常并返回默认值  
    return handleException(ex);  
});

CompletableFuture:Java中的异步编程利器,秋招总结&amp;小白入坑Java,java,开发语言

CompletableFuture小结

尽管CompletableFuture非常强大,但是过度使用它可能会导致代码变得复杂和难以维护。确保只在真正需要异步处理的地方使用它。

当使用线程池与CompletableFuture相结合的时候,要确保正确配置线程池的大小和参数,以避免资源耗尽或性能下降。

所以,异步编程虽然好用,但也带来了更多的复杂性和不确定性。还望各位佬在使用时需谨慎!

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

CompletableFuture:Java中的异步编程利器,秋招总结&amp;小白入坑Java,java,开发语言文章来源地址https://www.toymoban.com/news/detail-763986.html

到了这里,关于CompletableFuture:Java中的异步编程利器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「Java」《深入解析Java多线程编程利器:CompletableFuture》

    多线程编程是指在一个程序中同时执行多个线程来提高系统的并发性和响应性。在现代计算机系统中,多线程编程已经成为开发者日常工作的一部分。以下是对多线程编程需求和挑战的介绍: 需求: 提高系统的性能:通过同时执行多个线程,可以利用多核处理器的优势,实

    2024年02月11日
    浏览(36)
  • Java组合式异步编程CompletableFuture

    CompletableFuture是Java 8中引入的一个功能强大的Future实现类,它的字面翻译是“可完成的Future”。 CompletableFuture对并发编程进行了增强,可以方便地将多个有一定依赖关系的异步任务以流水线的方式组合在一起,大大简化多异步任务的开发。 CompletableFuture实现了两个接口,一个

    2024年04月09日
    浏览(26)
  • Flutter 中的 Stream:异步编程的利器

    在Flutter中,异步编程是非常重要的一部分,特别是在处理用户输入、网络请求或其他涉及时间的操作时。Flutter提供了一种强大的工具,称为Stream,用于简化异步编程的过程。 Stream是一种用于处理异步数据的流式 API。它可以用于处理一系列事件,例如用户输入、网络请求的响

    2024年02月03日
    浏览(35)
  • Java学习笔记-day06-响应式编程Reactor与Callback、CompletableFuture三种形式异步编码对比

    Reactor 是一个基于Reactive Streams规范的响应式编程框架。它提供了一组用于构建异步、事件驱动、响应式应用程序的工具和库。Reactor 的核心是 Flux (表示一个包含零到多个元素的异步序列)和 Mono 表示一个包含零或一个元素的异步序列)。 Reactor 通过提供响应式的操作符,如

    2024年02月03日
    浏览(33)
  • CompletableFuture异步编程事务及多数据源配置问题(含gitee源码)

    仓库地址: buxingzhe: 一个多数据源和多线程事务练习项目 小伙伴们在日常编码中经常为了提高程序运行效率采用多线程编程,在不涉及事务的情况下,使用dou.lea大神提供的CompletableFuture异步编程利器,它提供了许多优雅的api,我们可以很方便的进行异步多线程编程,速度杠杠

    2024年02月05日
    浏览(33)
  • CompletableFuture异步编程事务及多数据源配置详解(含gitee源码)

    仓库地址: buxingzhe: 一个多数据源和多线程事务练习项目 小伙伴们在日常编码中经常为了提高程序运行效率采用多线程编程,在不涉及事务的情况下,使用dou.lea大神提供的CompletableFuture异步编程利器,它提供了许多优雅的api,我们可以很方便的进行异步多线程编程,速度杠杠

    2024年01月22日
    浏览(33)
  • 【Java8新特性--->异步处理】CompletableFuture

    一、引入 假设一个商品详情页需要以下操作: 查询展示商品的基本信息耗时:0.5s 查询展示商品的销售信息耗时:0.7s 查询展示商品的图片信息耗时:1s 查询展示商品销售属性耗时:0.3s 查询展示商品规格属性耗时:1.5s 查询展示商品详情信息耗时:1s 即使每个查询时间耗时不

    2024年02月06日
    浏览(28)
  • defer 和 async:JavaScript异步编程的利器

    🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_ CSDN 博客专家、23年度博客之星前端领域TOP1 🕠 牛客 高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课 签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你

    2024年03月24日
    浏览(40)
  • Python异步网络编程利器——详解aiohttp的使用教程

    在现代Web应用程序开发中,网络请求是非常常见的操作。然而,传统的同步网络请求方式在处理大量请求时会导致性能瓶颈。为了解决这个问题,Python提供了aiohttp库,它是一个基于异步IO的网络请求库,可以实现高效的并发网络请求。本文将详细介绍aiohttp的各种使用方法,帮

    2024年02月06日
    浏览(38)
  • CompletableFuture异步回调

    CompletableFuture简介 CompletableFuture被用于异步编程,异步通常意味着非阻塞,可以使得任务单独允许在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常信息。 CompletableFuture实现了Future,CompletionStage接口,实现了Future接

    2024年02月05日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包