CompletableFuture方法全解

public class SpringbootWebApplicationTests {

    private final Logger logger = LoggerFactory.getLogger(SpringbootWebApplicationTests.class);

    private static final ExecutorService threadPool = Executors.newFixedThreadPool(5);

    @Test
    public void testCompletableFuture() throws Exception {

        // 1、第一组
        CompletableFuture.runAsync(() -> {
            logger.info("runAsync--无返回值");
        });
        CompletableFuture.runAsync(() -> {
            logger.info("runAsync--无返回值--指定线程池");
        }, threadPool);

        // 2、第二组
        CompletableFuture supplyAsync1 = CompletableFuture.supplyAsync(() -> {
            logger.info("supplyAsync--有返回值");
            return 1;
        });
        CompletableFuture supplyAsync2 = CompletableFuture.supplyAsync(() -> {
            logger.info("supplyAsync--有返回值--指定线程池");
            return 1;
        }, threadPool);

        // 3,任务回调
        // 3.1
        // thenApply和他的父任务在一个线程里
        CompletableFuture thenApply1 = supplyAsync1.thenApply((result) -> {
            logger.info("thenApply:supplyAsync1执行完毕后的回调,参数为supplyAsync1任务的返回值");
            return "result:" + result;
        });
        // thenApplyAsync和他的父任务可能不在一个线程里
        CompletableFuture thenApply2 = supplyAsync2.thenApplyAsync((result) -> {
            logger.info("thenApplyAsync:supplyAsync2执行完毕后的回调,参数为supplyAsync2任务的返回值");
            return "result:" + result;
        });
        // 可以指定线程池
        CompletableFuture thenApply3 = supplyAsync2.thenApplyAsync((result) -> {
            logger.info("thenApplyAsync--指定线程池:supplyAsync2执行完毕后的回调,参数为supplyAsync2任务的返回值");
            return "result:" + result;
        }, threadPool);

        // 3.2
        CompletableFuture thenAccept = thenApply1.thenAccept((result) -> {
            logger.info("thenAccept:thenApply1执行完毕后的回调,参数为thenApply1任务的返回值,没有返回值");
            int i = 1 / 0;
        });
        CompletableFuture thenRun = thenApply2.thenRun(() -> {
            logger.info("thenRun:thenApply2执行完毕后的回调,没有参数,也没有返回值");
        });

        // 3.3
        thenAccept.exceptionally((exception) -> {
            logger.info("exceptionally:任务异常后的回调,参数为异常信息");
            logger.info("异常信息", exception);
            return null;
        });
        thenApply3.whenComplete((result, exception) -> {
            logger.info("{},{}", result, exception);
            logger.info("whenComplete:任务异常后的回调,会将执行结果或者执行期间抛出的异常传递给回调方法,如果是正常执行则异常为null");
        });
        thenApply3.whenCompleteAsync((result, exception) -> {
            logger.info("{},{}", result, exception);
            logger.info("whenCompleteAsync:任务异常后的回调,会将执行结果或者执行期间抛出的异常传递给回调方法,如果是正常执行则异常为null");
        });
        thenApply3.whenCompleteAsync((result, exception) -> {
            logger.info("{},{}", result, exception);
            logger.info("whenCompleteAsync--指定线程池:任务异常后的回调,会将执行结果或者执行期间抛出的异常传递给回调方法,如果是正常执行则异常为null");
        }, threadPool);

        logger.info("supplyAsync获取返回值:" + supplyAsync1.get() + "--" + supplyAsync2.get());
        logger.info("thenApply获取返回值:" + thenApply1.get() + "--" + thenApply2.get() + "--" + thenApply3.get());
    }

}

Original: https://www.cnblogs.com/lm66/p/15847218.html
Author: Liming_Code
Title: CompletableFuture方法全解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575983/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • pg数据库匹配正则

    select ‘41142619960609331x’ ~ ‘^[1-9]\d{5}\d{4}((0[1-9])|(10|11|12))(([0…

    数据库 2023年6月16日
    088
  • Java并发编程-线程池

    重点内容 线程池的使⽤ 创建线程池 提交任务 关闭线程池 线程池的原理 合理配置线程池 线程池的监控 1.线程池的创建 new ThreadPoolExecutor(corePoo…

    数据库 2023年6月6日
    092
  • 【数据结构】跳表

    一、基本概念 1.1 定义 跳表(SkipList):增加了向前指针的链表叫做指针。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质是一种可以进行二分查找的有序链表。…

    数据库 2023年6月11日
    091
  • 自动化测试练手项目推荐

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/80599ac8.html 你好,我是测试蔡坨坨。 最近收到许多自学自动化测试的小伙伴私信,学习了理论知…

    数据库 2023年6月11日
    0113
  • MYSQL–>索引

    概述 索引是帮助MYSQL 高效获取数据的 有序数据结构 数据库维护着满足特定查找算法的数据结构,这种数据结构以某种方式指向数据。 这样就可以在数据结构上实现高级查找方法,这种数据…

    数据库 2023年6月14日
    087
  • 不扒瞎,这个程序让我从300s优化到了10s

    /*** RedisTemplate配置* @param lettuceConnectionFactory* @return*/ @Be…

    数据库 2023年6月9日
    061
  • Linux巡检脚本

    #!/bin/bash sys:centos6.x/7.x [ $(id -u) -ne 0 ] && echo "请&#x…

    数据库 2023年6月14日
    0109
  • MySQL日志系统bin log、redo log和undo log

    MySQL日志系统bin log、redo log和undo log 今人不见古时月,今月曾经照古人。 简介:日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息…

    数据库 2023年6月14日
    086
  • 一个小工具帮你搞定实时监控Nginx服务器

    Linux运维工程师的首要职责就是保证业务7 x 24小时稳定的运行,监控Web服务器对于查看网站上发生的情况至关重要。关注最多的便是日志变动,查看实时日志文件变动大家第一反应应该…

    数据库 2023年6月9日
    0150
  • 【StoneDB研发日志】列式存储 delete方案调研

    MySQL删除数据的方式 以MySQL 5.7为例,数据库删除数据的方式一共有以下三种: delete truncate drop 三种方式都可以删除数据,但使用场景有所不同。 […

    数据库 2023年5月24日
    093
  • 事务的ACID特性

    技术是为了解决问题而生的,通过事务我们可以解决以下问题: 多个操作不是一个整体操作,出现了部分执行成功的情况,导致数据的状态不一致问题(原子性) 一组操作只有部分完成,没有全部完成…

    数据库 2023年6月11日
    090
  • SQL中针对不规范数字order by排序的处理方式

    在操作数据库的时候经常需要order by进行排序,但是有的时候数据并没有很好的格式化导致排序的结果不合我们的心意,如下图: 如果我们要按照value进行排序的话,就会得到上面截图…

    数据库 2023年5月24日
    0107
  • 设计模式之(9)——适配器模式

    定义:适配器模式是将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作,在软件设计中我们需要将一些”现存的对象&#8…

    数据库 2023年6月14日
    047
  • Etcd 使用场景:通过分布式锁思路实现自动选主

    分布式锁?选主? 分布式锁可以保证当有多台实例同时竞争一把锁时,只有一个人会成功,其他的都是失败。诸如共享资源修改、幂等、频控等场景都可以通过分布式锁来实现。 还有一种场景,也可以…

    数据库 2023年6月6日
    095
  • MP 的攻击 SQL 阻断解析器(V3.4.0)

    一、何为SQL阻断器 官网给出的一句话 阻止恶意的全表更新删除 官网地址已经总结的很到位了 二、具体是如何实现的 也很简单,通过MP(Mybatis-Plus)的拦截器来实现,官方…

    数据库 2023年6月6日
    085
  • 【SQL实战】期末考试,如何统计学生成绩

    年关将至,这两天所有小学都进入了期末考试阶段。在考试结束时,有必要清点学生的分数。有趣的是,学校提供的成绩单现在并不直接标明分数,而是一个等级,如优秀、良好、合格、不及格。至少北京…

    数据库 2023年5月24日
    0162
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球