CompletableFuture结合线程池初步使用

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

CompletableFuture详解

CompletableFuture 是 Java 8 引入的一个类,用于支持异步编程和函数式编程。CompletableFuture 的优点包括:

  1. 异步编程:CompletableFuture 支持异步编程,可以在异步任务完成之前继续执行其他任务,从而提高程序的效率和吞吐量。
  2. 链式调用:CompletableFuture 提供了丰富的方法来支持链式调用,可以使用函数式编程的风格编写代码,使代码更加简洁、易读、易于维护。
  3. 组合操作:CompletableFuture 提供了多个方法来支持组合操作,例如 thenCompose()、thenCombine()、allOf()、anyOf() 等,可以让开发者更加灵活地组合多个异步任务的执行结果。
  4. 异常处理:CompletableFuture 提供了多个方法来支持异常处理,例如 exceptionally()、handle() 等,可以方便地捕获和处理异步任务中可能出现的异常。
  5. 线程池控制:CompletableFuture 可以通过指定 Executor 来控制异步任务的执行线程池,可以灵活地调整线程池大小和线程数,从而更好地控制程序的性能和资源消耗。

总之,CompletableFuture 是一种强大而灵活的异步编程工具,可以极大地提高程序的效率和可维护性。

​ 常用的方法

thenApply():当 CompletableFuture 完成时,执行指定的函数并返回一个新的 CompletableFuture,该函数接收前一个 CompletableFuture 的结果,并返回新的结果。
thenAccept():当 CompletableFuture 完成时,执行指定的操作但不返回任何结果,该操作接收前一个 CompletableFuture 的结果。
thenRun():当 CompletableFuture 完成时,执行指定的操作并返回一个新的 CompletableFutureexceptionally():在 CompletableFuture 异常时,执行指定的函数,该函数将异常转换为正常结果或抛出一个新的异常。
whenComplete():在 CompletableFuture 完成时执行指定的操作,该操作接收前一个 CompletableFuture 的结果或异常。
handle():当 CompletableFuture 完成时,执行指定的函数,该函数可以处理正常结果或异常,并返回一个新的结果。
thenCompose():在 CompletableFuture 完成时,执行指定的函数并返回一个新的 CompletableFuture,该函数接收前一个 CompletableFuture 的结果,并返回一个新的 CompletableFuture

常用的静态方法

CompletableFuture.runAsync():在异步任务中执行没有返回值的操作。
CompletableFuture.supplyAsync():在异步任务中执行有返回值的操作。
CompletableFuture.completedFuture():创建一个已经完成的 CompletableFuture 实例。
CompletableFuture.anyOf():返回一个 CompletableFuture,其结果是给定 CompletableFuture 中最快完成的一个。
CompletableFuture.allOf():返回一个 CompletableFuture,其结果是给定 CompletableFuture 中所有任务完成后的结果。
CompletableFuture.exceptionally():在 CompletableFuture 异常时,执行指定的函数。
CompletableFuture.thenApply():在 CompletableFuture 完成后,执行指定的函数并返回一个新的 CompletableFutureCompletableFuture.thenAccept():在 CompletableFuture 完成后,执行指定的操作但不返回任何结果。
CompletableFuture.thenRun():在 CompletableFuture 完成后,执行指定的操作并返回一个新的 CompletableFutureCompletableFuture.thenCompose():在 CompletableFuture 完成后,执行指定的函数并返回一个新的 CompletableFuture

链式调用示例

    CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 2)
            .thenApplyAsync(x -> x * 3)
            .thenApplyAsync(x -> x + 1)
            .thenApplyAsync(x -> x * 2);
    future.thenAccept(System.out::println);

使用thenApplyAsync方法将一系列任务串联起来,并在最后使用thenAccept方法处理最终的结果

组合线程池调用示例

// 创建一个自定义的线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
// 使用CompletableFuture提交一个异步任务到线程池中
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    // 异步任务的代码
}, executor);

// 阻塞等待异步任务完成
future.get();

// 关闭线程池
executor.shutdown();

合并多个异步返回结果示例

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> getFirstResult());
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> getSecondResult());

CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);

allFutures.join();

String combinedResult = future1.join() + future2.join();


CompletableFuture.supplyAsync()方法接收一个Supplier类型的参数,该参数表示异步操作的执行体。在这里,使用lambda表达式将getFirstResult()getSecondResult()作为Supplier传递给了supplyAsync()方法。

CompletableFuture.allOf()方法接收一个可变参数列表,每个参数都是一个CompletableFuture。在这里,将future1和future2传递给了allOf()方法,表示需要等待这两个CompletableFuture全部完成。

allFutures.join()方法会阻塞当前线程,直到所有的CompletableFuture都完成。

最后,将future1.join()和future2.join()的结果拼接成一个字符串,并将其存储在combinedResult变量中。join()方法会等待CompletableFuture完成并返回其结果。因为在调用allOf().join()方法之后,所有的CompletableFuture都已经完成,所以这里可以直接调用future1.join()和future2.join()方法获取它们的结果。

将CompletableFuture 带入业务 实现简单的查询合并成map返回

文章来源地址https://www.toymoban.com/news/detail-484085.html

 //通过传入的不同产品获取不同的商品对应的数量,返回map类型的数据集
public CompletableFuture<Map<String, String>> getAsync(List<String> products, ExecutorService executorService) {
        List<CompletableFuture<Map.Entry<String, String>>> futures = new ArrayList<>();
        for (String product : products) {
            CompletableFuture<Map.Entry<String, String>> future = CompletableFuture.supplyAsync(() -> {
                String num = "";
                if (product.equals("xxx")) {
                    num = String.valueOf(xxxService.list().size());
                }
                if (product.equals("xxx")) {
                    num = String.valueOf(xxxService.list().size());
                }
                if (product.equals("xxx")) {
                    num = String.valueOf(xxxService.list().size());
                }
                if (product.equals("xxx")) {
                    num = String.valueOf(xxxService.list().size()));
                }
                return (Map.Entry<String, String>) new AbstractMap.SimpleEntry<String, String>(product, price);
            }, executorService);
            futures.add(future);
        }
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
        return allFutures.thenApplyAsync(v -> {
            Map<String, String> resultMap = new HashMap<>();
            for (CompletableFuture<Map.Entry<String, String>> future : futures) {
                Map.Entry<String, String> entry = future.join();
                resultMap.put(entry.getKey(), entry.getValue());
            }
            return resultMap;
        }, executorService);
    
 // 具体调用如下:
            ExecutorService executorService = Executors.newFixedThreadPool(4);
            List<String> list = Arrays.asList("商品1", "商品2", "商品3", "商品4");
            CompletableFuture<Map<String, String>> future = getAsync(list, executorService);
            Map<String, String> map = future.get();
            map.forEach((key, value) -> System.out.println(key + ":" + value));
            executorService.shutdown();
				

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

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

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

相关文章

  • Java的CompletableFuture,Java的多线程开发

    如下图: 以后用到再加 get() 和 join() 方法区别? 都可以阻塞线程 —— 等所有任务都执行完了再执行后续代码。 anyOf() 和 allOf() 的区别? 无返回值 推荐: 开启多线程——无返回值的——阻塞 :test06 有返回值 推荐:开启多线程——有返回值的,返回一个新的List——阻塞—

    2024年02月06日
    浏览(46)
  • 「Java」《深入解析Java多线程编程利器:CompletableFuture》

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

    2024年02月11日
    浏览(50)
  • CompletableFuture与线程池:Java 8中的高效异步编程搭配

    摘要:在Java 8中,CompletableFuture和线程池的结合使用为程序员提供了一种高效、灵活的异步编程解决方案。本文将深入探讨CompletableFuture和线程池结合使用的优势、原理及实际应用案例,帮助读者更好地理解并掌握这一技术。 随着多核处理器的普及,应用程序的性能和响应能

    2024年02月07日
    浏览(62)
  • 【CompletableFuture任务编排】游戏服务器线程模型及其线程之间的交互(以排行榜线程和玩家线程的交互为例子)

    需求: 1.我们希望玩家的业务在玩家线程执行,无需回调,因此是多线程处理。 2.匹配线程负责匹配逻辑,是单独一个线程。 3.排行榜线程负责玩家的上榜等。 4.从排行榜线程获取到排行榜列表后,需要给玩家发奖修改玩家数据,因此涉及到排行榜线程和玩家线程的交互。

    2024年01月22日
    浏览(47)
  • Springboot结合线程池的使用

    配置文件 配置类 方式一:线程池结合CompletableFuture来实现 配置线程池类 CompletableFuture使用线程池进行调用 任务类 方式二:使用@EnableAsync和@Async方式实现 在启动类上加@EnableAsync注解 编写线程池配置 使用 任务类 方式三:重写springboot默认的线程池配置 在启动类上加@EnableAsy

    2024年02月01日
    浏览(54)
  • 自定义线程池 02 - 初步实现线程池

    完整代码已上传gitee ,地址 :朱元杰的开源仓库 – ThreadPool核心源码仿写 完整文章栏目地址在:Fearless____的博客 - ThreadPool仿写 上一步我们已经实现阻塞队列(任务队列),接下来 初步实现 线程池 将线程池类定义为 MyThreadPool 线程池中需要有如下属性: 任务队列 private My

    2024年02月13日
    浏览(32)
  • CompletableFuture异步任务编排使用

    runAsync(runnable):无返回值 runAsync(runnable, executor):无返回值,可自定义线程池 supplyAsync(runnable):有返回值 supplyAsync(runnable, executor):有回值,可自定义线程池 相关代码演示: 解析:oneFuture.join()获取的执行结果为null,因为runAsync是没有返回结果的。 allOf(future1,future2,future3…):

    2024年02月04日
    浏览(37)
  • CompletableFuture的使用

    目录 一、前言 二、概念介绍  三、自身特性 四、使用方式 1、异步执行一个任务并获取结果 2、异步执行一个任务并处理异常 3、异步执行多个任务并合并结果 4、异步执行多个任务并处理其中一个任务的结果 5、串行执行多个任务 6、 检查异步任务是否执行完成和执行回调

    2024年02月15日
    浏览(45)
  • CompletableFuture使用详解

    1.1 概述 在上一篇文章《CompletionService使用与源码分析》中,已经介绍过了 Future 的局限性,它没法直接对多个任务进行链式、组合等处理,需要借助并发工具类才能完成,实现逻辑比较复杂。 而 CompletableFuture 是对 Future 的扩展和增强。 CompletableFuture 实现了 Future 接口,并在此

    2024年01月18日
    浏览(36)
  • CompletableFuture使用详解(全网看这一篇就行)

    CompletableFuture是jdk8的新特性。CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步会点、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利。 1. supplyAsync supplyAsync是创建带有返回值的异步任务。它有如下两

    2024年02月03日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包