Junit测试中多线程的坑

本文探讨了使用Junit测试多线程应用时遇到的问题,即Junit执行完毕后会关闭程序,导致后台线程未完全执行。通过引入CountDownLatch解决同步问题,确保所有线程完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨晚用Junit测试多线程,代码如下:

private int i = 3;

@Test
public void test() {
	
	for (int i = 0; i < this.i; i ++) {
		new Thread(new Runner()).start();
	}
}

class Runner implements Runnable {
	
	@Override
	public void run() {
		System.out.printlun(123);
	}
}

发现运行后居然没有任何输出…我又运行了好几次,有时又有1~2句输出,但是始终不全…

当时还以为程序有错,clean了class继续,还是一样的,今天早上起来查了下百度,才明白,原来Junit只管自己的运行,就是说当Junit执行完毕后,就会关闭程序,不会关心是否还有自己启动的后台线程在运行。当Junit运行完毕后,如果后台线程还没有执行完毕,那么也是不会再执行了,所以就出现了昨天的情况…

我始终对多线程的执行过程没有意识呢…主线程和后台线程的关系和执行一定要搞清楚呢…

现在既然搞清楚了,那就好办了,下面代码展示如何优雅的将Junit主线程设置为同步线程:

private int i = 3;
/*
 * 线程计数器
 * 	将线程数量初始化
 * 	每执行完成一条线程,调用countDown()使计数器减1
 * 	主线程调用方法await()使其等待,当计数器为0时才被执行
 */
private CountDownLatch latch = new CountDownLatch(i);

@Test
public void test() {
	
	for (int i = 0; i < this.i; i ++) {
		new Thread(new Runner()).start();
	}
	
	try {
		latch.await(); // 主线程等待
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

class Runner implements Runnable {
	
	@Override
	public void run() {
		
		System.out.printlun(123);
		latch.countDown(); // 执行完毕,计数器减1
	}

这样改变代码之后,一切正常了!

<think>好的,用户现在想在简历中写一个基于Java的小鸟大冒险游戏项目。首先,我需要理解这个项目的具体情况。可能用户自己开发过似Flappy Bird的游戏,想展示自己的编程能力。 用户的需求是优化简历中的项目描述,所以需要突出技术细节和成果。但用户可能没有明确说明项目的规模、使用的具体技术或遇到的挑战,所以可能需要引导用户补充这些信息,但根据历史对话,用户可能希望直接得到建议。 接下来要考虑的是简历中项目描述的结构。通常包括项目名称、技术栈、职责描述、关键成果等部分。需要用简洁有力的语言,使用技术术语,同时量化成果,比如性能提升多少,用户增长多少。 还要考虑如何展示技术能力,比如多线程处理、碰撞检测算法、界面优化等。用户可能用到了Swing或JavaFX这样的库,需要明确提到。此外,可能需要提到版本控制工具,如Git,以及是否进行了测试或持续集成。 另外,用户可能没有考虑到如何将项目与岗位要求匹配。比如,如果申请的是游戏开发岗位,需要强调游戏引擎的使用、物理引擎的集成;如果是后端开发,可以侧重性能优化和架构设计。 需要避免过于笼统的描述,比如“开发了一个游戏”,而应具体说明实现了哪些功能,解决了哪些技术难题。例如,优化帧率、处理用户输入、设计关卡等。 最后,要确保用行动动词开头,如“设计”、“开发”、“优化”、“实现”等,并展示成果,比如“提升30%的流畅度”、“减少20%的内存占用”等。同时,如果项目有上线或获得用户反馈,也可以提及,以证明实际效果。</think>以下是针对Java版《小鸟大冒险》游戏项目的简历撰写建议(框架+技术细节+数据化呈现): --- ### **项目名称**:基于JavaFX的2D横版闯关游戏《Flappy Adventure》 **技术栈**:Java 17 + JavaFX + Gradle + JFugue(音效引擎) + Git **开发周期**:独立开发/3人小组(根据实际情况选择) --- ### **项目亮点描述**(STAR法则) 1. **物理引擎开发** - 实现抛物线运动公式:$$y = v_0t + \frac{1}{2}at^2$$ - 构建碰撞检测算法:使用`Shape.intersect()`方法实现像素级碰撞检测,响应时间<15ms - 优化性能:通过双缓冲技术将帧率稳定在60FPS 2. **游戏系统设计** - 开发关卡编辑器:使用JSON配置关卡参数(管道间距/移动速度/奖励位置) - 成就系统:采用观察者模式实现实时成就解锁提醒 - 数据持久化:通过JDBC将玩家成绩存储至SQLite,支持TOP10排行榜 3. **技术突破** - 解决JavaFX线程阻塞问题:采用`Platform.runLater()`实现UI线程与游戏逻辑线程分离 - 内存优化:通过对象池复用技术减少35%的GC频率 - 跨平台部署:使用`jpackage`生成exe/dmg安装包,安装包体积<50MB --- ### **成果量化**(根据实际情况调整) - 完成8个关卡原型开发,通过自动化测试覆盖86%核心功能 - 在校园内测期间获得200+次下载,平均游戏时长7.2分钟 - GitHub仓库收获32 stars,被纳入Java游戏开发教学案例库 --- ### **避指南** ```markdown # 错误写法 ❌ "使用Java开发了一个小鸟游戏,实现了基本跳跃功能" # 正确写法 ✅ "基于事件驱动架构开发游戏核心循环,通过Lambda表达式处理用户输入事件, 利用QuadTree空间分割算法优化碰撞检测性能(提升40%计算效率)" ``` --- ### **技术深度扩展建议** 若涉及以下技术可补充: 1. 使用Java Module System实现模块化封装 2. 集成JUnit5进行测试(如抛物线运动公式验证) 3. 采用MVC模式分离业务逻辑与视图层 4. 使用Java Sound API实现3D音效定位 --- ### **简历适配技巧** - 投递**游戏公司**:强调物理引擎/性能优化/用户留存设计 - 投递**金融公司**:突出数据持久化/线程安全/异常处理机制 - 投递**跨境电商**:侧重国际化实现(多语言资源文件加载) 最后建议在GitHub部署可运行的jar包,并在简历中附带二维码(统计访问量作为数据支撑)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值