0

0

Java多线程单测怎么写 Java并发程序测试工具指南【实战】

煙雲

煙雲

发布时间:2026-02-09 10:10:02

|

745人浏览过

|

来源于php中文网

原创

单元测试中启动多线程需避免Thread.sleep(),应使用CountDownLatch或CyclicBarrier同步、ExecutorService配shutdown/awaitTermination清理、AtomicInteger等线程安全类型保护共享状态,并用@RepeatedTest和@Timeout提升并发问题暴露概率。

java多线程单测怎么写 java并发程序测试工具指南【实战】

单测里启动多线程,Thread.sleep() 不可靠

Java 单元测试默认运行在单线程中,一旦你手动 new Thread() 或用 ExecutorService 启动并发逻辑,就面临“主线程提前结束、子线程还没跑完”的问题。很多人第一反应是加 Thread.sleep(1000) 等结果,但这是典型反模式:既不稳定(慢机器可能没睡够),又拖慢整个测试套件。

更稳妥的做法是用同步机制显式等待:

  • CountDownLatch:主线程 await(),每个工作线程完成时 countDown()
  • CyclicBarrier:适合多个线程需在某点“齐步走”的场景(如并发初始化)
  • 避免在测试里依赖时间,除非你明确在测超时逻辑(此时应用 CompletableFuture.orTimeout()Future.get(timeout, unit)

ExecutorService 必须显式 shutdown()awaitTermination()

测试中常用 Executors.newFixedThreadPool(2) 模拟并发,但若不清理,线程池会持续持有非守护线程,导致 JUnit 进程无法退出——尤其在 Maven 多模块构建或 CI 环境下,可能卡住后续测试。

正确写法必须成对出现:

立即学习Java免费学习笔记(深入)”;

ExecutorService executor = Executors.newFixedThreadPool(2);
try {
    // 提交任务...
    executor.submit(() -> doWork());
    // 等待所有任务结束
    executor.shutdown();
    assertTrue(executor.awaitTermination(3, TimeUnit.SECONDS));
} finally {
    if (!executor.isTerminated()) {
        executor.shutdownNow(); // 强制终止残留任务
    }
}

注意:awaitTermination() 返回 false 表示超时未结束,此时应调用 shutdownNow() 并检查是否真有死循环或阻塞 I/O。

共享状态被多个线程修改?用 AtomicIntegerConcurrentHashMap 替代普通变量

常见错误:在测试里定义一个 int count = 0,然后多个线程都执行 count++,最后断言 count == 10 ——这几乎必然失败,因为 ++ 不是原子操作。

MakeLogo AI
MakeLogo AI

AI驱动的Logo生成器

下载

解决方式取决于测试目的:

  • 如果只是验证并发逻辑的**正确性**(比如计数器最终值),直接用 AtomicInteger:它能保证可见性和原子性,且无需额外同步
  • 如果模拟真实业务对象(如缓存、队列),优先用线程安全容器:ConcurrentHashMapCopyOnWriteArrayList,而非加 synchronized 块包装 HashMap ——后者易漏锁、难覆盖边界
  • 慎用 volatile:它只保可见性,不保原子性,volatile int 仍不能安全做 ++

JUnit 5 的 @RepeatedTest@Timeout 是并发测试的加速器

并发 Bug 往往具有随机性(如竞态、丢失唤醒),单次运行很难复现。靠人工反复跑 mvn test 效率太低。

JUnit 5 提供两个关键能力:

  • @RepeatedTest(100):连续运行同一测试 100 次,显著提升暴露概率;注意每次调用都是干净实例,无需手动重置状态
  • @Timeout(value = 500, unit = TimeUnit.MILLISECONDS):给测试方法设硬性超时,防止因死锁、无限等待导致整个测试套件挂起
  • 组合使用效果更好:比如 @RepeatedTest(50) @Timeout(200),既压测又防卡死

注意:@Timeout 对整个测试方法生效,不是对某个 Future.get() 单独设限;若需细粒度控制,仍得用 Future.get(200, MILLISECONDS)

并发单测最难的不是写代码,而是设计可重复、可观测、可终止的测试场景。线程调度不可控,所以一切依赖“运气”的等待和断言都要替换为显式同步;资源不释放比逻辑出错更隐蔽,所以 ExecutorService 的生命周期管理必须像数据库连接一样严格。别让测试本身成为并发 bug 的温床。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

447

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

304

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

20

2025.10.24

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

646

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

553

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

173

2025.08.29

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

98

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.4万人学习

C# 教程
C# 教程

共94课时 | 9万人学习

Java 教程
Java 教程

共578课时 | 61.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号