当前位置: 首页 > news >正文

玩碎Java之CompletableFuture的例子

线程池循环引用会导致死锁

public Object doGet() {
  ExecutorService threadPool1 = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(100));
  CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> {
  //do sth
    return CompletableFuture.supplyAsync(() -> {
        System.out.println("child");
        return "child";
      }, threadPool1).join();//子任务
    }, threadPool1);
  return cf1.join();
}

如上代码块所示,doGet方法第三行通过supplyAsync向threadPool1请求线程,并且内部子任务又向threadPool1请求线程。threadPool1大小为10,当同一时刻有10个请求到达,则threadPool1被打满,子任务请求线程时进入阻塞队列排队,但是父任务的完成又依赖于子任务,这时由于子任务得不到线程,父任务无法完成。主线程执行cf1.join()进入阻塞状态,并且永远无法恢复。

为了修复该问题,需要将父任务与子任务做线程池隔离,两个任务请求不同的线程池,避免循环依赖导致的阻塞。

参考

CompletableFuture原理与实践-外卖商家端API的异步化
异步编程利器:CompletableFuture详解 |Java 开发实战

http://www.dtcms.com/a/1824.html

相关文章:

  • Java初始化大量数据到Neo4j中(二)
  • lambda的使用案例(1)
  • 探索视听新纪元: ChatGPT的最新语音和图像功能全解析
  • Flutter笔记:AnimationMean、AnimationMax 和 AnimationMin 三个类的用法
  • 朴素贝叶斯分类(下):数据挖掘十大算法之一
  • 了解ActiveMQ、RabbitMQ、RocketMQ和Kafka的特点
  • 嵌入式开源库之libmodbus学习笔记
  • 27、Flink 的SQL之SELECT (Pattern Recognition 模式检测)介绍及详细示例(7)
  • Linux网络编程- struct ifreq ioctl() 系统调用
  • Android 13 - Media框架(8)- MediaExtractor(2)
  • 机器学习第十四课--神经网络
  • stream对list数据进行多字段去重
  • 问答区混赏金的集合贴
  • 华为杯数学建模比赛经验分享
  • $nextTick解决echarts宽度固定为100%的问题
  • Armv9 Cortex-A720的L2 memory system 和 L2 Cache
  • Leetcode 297. 二叉树的序列化与反序列化
  • 【LeetCode】滑动窗口妙解无重复字符的最长子串
  • 华为智能高校出口安全解决方案(2)
  • Ubuntu Qt 5.15.2 支持 aarch64
  • 【李沐深度学习笔记】损失函数
  • C++与数据结构面经(重中之重)
  • 83、SpringBoot --- 下载和安装 MSYS2、 Redis
  • 【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(LDxLDxR)?
  • 数据响应式原理
  • Java on Azure Tooling 8月更新|以应用程序为中心的视图支持及 Azure 应用服务部署状态改进
  • Redis与Mybatis
  • 批量删除wordpress文章修订版本/自动草稿残留数据(3种方法)及四种方法禁用WordPress文章历史修订/自动保存/自动草稿功能
  • [JAVAee]MyBatis
  • MySQL数据类型与表单创建