Junit多线程的坑

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

先看代码:

java 复制代码
@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方法,即主线程会等待子线程执行完毕后再消亡

java 复制代码
...... 前置逻辑
getThread.start();
getThread.join();
...... 后续逻辑

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

相关推荐
前端世界2 小时前
float 还是 double?用储罐体积计算带你看懂 C 语言浮点数的真实世界坑
java·c语言·开发语言
豐儀麟阁贵2 小时前
8.5在方法中抛出异常
java·开发语言·前端·算法
Bro_cat3 小时前
Java基础
java·开发语言·面试
一起养小猫3 小时前
《Java数据结构与算法》第三篇(下)队列全解析:从基础概念到高级应用
java·开发语言·数据结构
vx_vxbs663 小时前
【SSM电动车智能充电服务平台】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·spring cloud·小程序·php·idea
叹隙中驹石中火梦中身3 小时前
解耦神器Event和EventListener
java
Boop_wu3 小时前
[Java EE] 多线程进阶(JUC)(2)
java·jvm·算法
小坏讲微服务3 小时前
SpringCloud整合Scala实现MybatisPlus实现业务增删改查
java·spring·spring cloud·scala·mybatis plus
N***p3653 小时前
五大消息模型介绍(RabbitMQ 详细注释版)
java·rabbitmq·java-rabbitmq
雨中飘荡的记忆4 小时前
深入理解设计模式之单例模式
java·设计模式