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)

大家都在看

  • Android Studio的初次认识

    Android的初试 一、认识Android Studio 在我们新建项目的时候,会遇到这样的一个窗口,首先我们认识一下这些都是什么,这样我们才能够更好的进行下一步的学习! 这里的…

    数据库 2023年6月11日
    0113
  • 项目主干分支的server.sh被“覆盖”了?一个配置,解除烦恼

    我司项目利用springboot搭建,应用在部署到各环境后,程序启动命令靠的是我们在工程里配置的 scripts/server.sh。这个server.sh里最重要的东西是程序启动…

    数据库 2023年6月9日
    0103
  • 视野 | KeyDB:为 Web 应用而生的高性能 Redis 分支

    王奇 顾问软件工程师目前从事 PaaS 中间件服务(Redis / MongoDB / ELK 等)开发工作,对 NoSQL 数据库有深入的研究以及丰富的二次开发经验,热衷对 No…

    数据库 2023年5月24日
    086
  • MySQL实战45讲 3

    03 | 事务隔离:为什么你改了我还看不见? 事务 Transaction TRX 事务就是 要保证一组数据库操作,要么全部成功,要么全部失败。 MySQL 原生的 MyISAM …

    数据库 2023年5月24日
    065
  • 设计模式之(4)——单例模式

    定义:单例模式属于创建型模式,该类负责创建自己的对象实例,并且确保只有单个对象被创建,同时该类提供了一种全局访问其唯一实例对象的方式;这个定义中有三个要点:1、单例类只能有一个实例…

    数据库 2023年6月14日
    076
  • 文件输入/输出流

    文件输入/输出流程序 运行期间,大部分数据都被存储在 内存中,当程序结束或被关闭时,存储在内存中的数据将会 消失。如果要 永久保存数据,那么最好的办法就是把数据保存到 磁盘的文件中…

    数据库 2023年6月16日
    0106
  • 【黄啊码】linux利用lvs+Keepalived实现负载均衡

    负载均衡:两台(一主一备) LVS + Keepalived+三台HTTP服务器 这是我的第一台HTTP服务器【这里使用的是现成lnmp,然后复制出三台一模一样的】 在每台(HTT…

    数据库 2023年6月16日
    088
  • 计算机操作系统(慕课版)思维导图

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    084
  • leetcode 637. Average of Levels in Binary Tree 二叉树的层平均值(简单)

    一、题目大意 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root = [3,…

    数据库 2023年6月16日
    065
  • 设计模式之(1)——简单工厂模式

    创建型模式:主要用于对象的创建; 结构型模式:用于处理类或者对象的组合; 行为型模式:用于描述类或对象怎样交互和分配职责; ————————————————————————————…

    数据库 2023年6月14日
    087
  • 最新漏洞:Spring Framework远程代码执行漏洞

    Spring Framework远程代码执行漏洞 发布时间 2022-03-31 漏洞等级 High CVE编号 CVE-2022-22965 影响范围:同时满足以下三个条件可确定…

    数据库 2023年6月6日
    085
  • 双色球系统开发

    Java对彩票双色球系统开发的简单实现 双色球系统 案例: 中奖条件及奖金表 代码及解释 main方法代码: public static void main(String[] ar…

    数据库 2023年6月16日
    0104
  • Linux系统安装JDK

    准备工作 1.去JDK的官网下载一个1.8的安装包 2.解压到linux系统 tar -zxvf jdk-8u311-linux-x64.tar.gz -C /download/c…

    数据库 2023年6月6日
    075
  • mydumper备份mysql8.0 sql thread被kill掉

    这个问题是好久以前的问题了,今天看自己的笔记,发现了这个问题,当时没有进行细看,想着现在复现一下。 1、半夜收到测试数据库备份告警: 报警内容就是8002端口,备份失败,因为有慢查…

    数据库 2023年6月16日
    075
  • 相同执行计划,为何有执行快慢的差别

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 前言 今天遇到一个很神奇的现象,…

    数据库 2023年5月24日
    073
  • StoneDB完成华为鲲鹏国产处理器适配认证!

    近日,一体化实时 HTAP 数据库 StoneDB 与华为鲲鹏 920 已完成并通过相互兼容性测试认证,取得 KUNPENG COMPATIBLE 证书及认证徽标的使用权。 该认证…

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