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

Junit多线程的坑

关于使用Junit测试多线程的坑

先看代码:

@Test
public void testEhCache() throws InterruptedException {Thread putThread = new Thread(() -> {EhCacheUtil cacheUtil = EhCacheUtil.getInstance();cacheUtil.preConfigureCache("shortTermCache", 5L);cacheUtil.putToCache("shortTermCache", "tempData", "临时数据");});putThread.start();// 为确保 putThread 放数据成功,让主线程睡眠1秒后再启动获取数据的线程Thread.sleep(1000);Thread getThread= new Thread(() -> {EhCacheUtil cacheUtil = EhCacheUtil.getInstance();String fromCache = cacheUtil.getFromCache("shortTermCache", "tempData");System.out.println("获取数据:"+fromCache);});getThread.start();
}

上面的代码中,EhCacheUtil是自己写的一个EhCache缓存的工具类,线程putThread用于向缓存中放置数据,getThread从缓存中取出数据

大坑

putThread线程放数据成功,但是getThread线程执行到 String fromCache = cacheUtil.getFromCache(“shortTermCache”, “tempData”); 从缓存中获取数据时,就整个程序结束了,代码System.out.println(“获取数据:”+fromCache);都不会执行,控制台也不会输出日志。也没有任何报错

原因

从缓存中获取数据时,需要的时间比主线程运行时间长,因此在主线程结束时,子线程getThread获取数据还未完成,就被强制退出,因为Junit 4 和 5 的默认行为是:当测试方法(主线程)执行完毕后,测试进程会退出,此时所有未完成的子线程可能被强制终止(取决于 JVM 实现)。即使子线程仍在运行,它们的输出或后续操作可能无法完整执行

解决方法

1、在开启线程后,立即调用join方法,即主线程会等待子线程执行完毕后再消亡

...... 前置逻辑
getThread.start();
getThread.join();
...... 后续逻辑

2、使用main方法来测试,但是要注意不要设置子线程为守护线程

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

相关文章:

  • Python爬虫动态IP代理报错全解析:从问题定位到实战优化
  • 【牛客刷题】超级圣诞树(递归法和分形复制法)
  • 实时数仓和离线数仓还分不清楚?看完就懂了
  • SpringCloud 运用(5)—— sentinel限流与seata分布式事务
  • 「备忘」查询日志
  • Spring Boot整合MyBatis+MySQL实战指南(Java 1.8 + 单元测试)
  • 从 JavaFX WebView 迁移至 JxBrowser
  • 【科研绘图系列】R语言绘制系统发育树和柱状图
  • 以科技赋能未来,科聪持续支持青年创新实践 —— 第七届“科聪杯”浙江省大学生智能机器人创意竞赛圆满落幕
  • 宝塔 php支持sqlserver
  • 稀疏激活大模型推理优化:突破效率瓶颈的曙光
  • JavaScript VMP (Virtual Machine Protection) 分析与调试
  • 动态规划初步(完全背包)
  • The 2023 ICPC Asia Hangzhou Regional Contest (H. Sugar Sweet II(基环树,期望))
  • 闲庭信步使用图像验证平台加速FPGA的开发:第九课——图像插值的FPGA实现
  • 【JMeter】执行SQL
  • Elasticsearch 滚动(Scroll)用法、使用场景及与扫描(Scan)的区别
  • Linux 下使用 vim 文本编辑器时的操作指令
  • OGG-00551 ODBC error: SQLSTATE 22007,从字符串转换日期和/或时间时,转换失败
  • 和鲸社区深度学习基础训练营2025年关卡3_Q1(1)
  • 零基础入门:Air8000系列蓝牙配网开发(LuatOS版)
  • 攻防世界——web题 upload
  • Laravel + Python 图片水印系统:实现与调试指南
  • 将七大核心理念融入AI Agent设计——构建“数字生命体”的宏伟蓝图
  • 大数据在UI前端的应用创新:基于用户反馈的产品迭代优化系统
  • UI前端大数据可视化实战技巧:如何利用数据故事化提升用户参与度?
  • 前端面试专栏-算法篇:22.树结构(二叉树、B树、红黑树)
  • Web 应用防火墙:守护应用安全的核心屏障
  • webpack高级配置
  • OpenAvatarChat数字人项目结构分析