单元测试中创建多个线程测试 ThreadLocal
单元测试中创建多个线程测试 ThreadLocal
在单元测试中,可以通过以下方式创建多个线程来测试 ThreadLocal 的行为。
目标
验证 ThreadLocal 在多线程环境下是否能正确隔离每个线程的数据。
实现步骤
-
定义需要测试的类
包含ThreadLocal对象的类,提供设置和获取ThreadLocal数据的方法。 -
创建多线程测试方法
使用ExecutorService或直接创建多个线程,分别访问和操作ThreadLocal数据。 -
验证结果
每个线程的数据应相互隔离,互不影响。
示例代码
import org.junit.jupiter.api.Test;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import static org.junit.jupiter.api.Assertions.assertEquals;public class ThreadLocalTest {// 被测试的类,包含 ThreadLocalstatic class ThreadLocalDemo {private static final ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "default");public void set(String value) {threadLocal.set(value);}public String get() {return threadLocal.get();}public void remove() {threadLocal.remove();}}@Testpublic void testThreadLocalIsolation() throws InterruptedException {ThreadLocalDemo demo = new ThreadLocalDemo();int numThreads = 5; // 创建5个线程ExecutorService executor = Executors.newFixedThreadPool(numThreads);// 用于存储线程执行结果List<String> results = new ArrayList<>();List<Thread> threads = new ArrayList<>();// 创建并启动多个线程for (int i = 0; i < numThreads; i++) {final int threadId = i;executor.submit(() -> {String threadName = "Thread-" + threadId;demo.set(threadName); // 设置 ThreadLocal 数据results.add(demo.get()); // 获取并存储 ThreadLocal 数据demo.remove(); // 清理 ThreadLocal 数据});}// 关闭线程池并等待任务完成executor.shutdown();while (!executor.isTerminated()) {Thread.sleep(100);}// 验证每个线程的结果for (int i = 0; i < numThreads; i++) {assertEquals("Thread-" + i, results.get(i));}}
}
代码详解
-
ThreadLocalDemo- 定义了一个
ThreadLocal对象。 - 提供
set,get, 和remove方法操作ThreadLocal。
- 定义了一个
-
线程池创建
- 使用
ExecutorService提供线程池,便于管理多个线程的执行。 - 每个线程独立操作
ThreadLocal。
- 使用
-
结果验证
- 在主线程中验证每个线程的数据是否与预期一致。
assertEquals检查线程隔离是否成功。
注意事项
-
线程安全
results使用ArrayList,在多线程中写入时需要考虑线程安全性,可以使用Collections.synchronizedList或类似机制。 -
资源清理
测试结束后调用ThreadLocal.remove(),避免内存泄漏。 -
并发问题
使用ExecutorService可以避免直接使用Thread带来的管理复杂性。
通过上述代码,可以验证 ThreadLocal 的隔离性及其在多线程环境中的行为。如果出现问题,可以进一步分析线程间的数据传递逻辑是否正确。
相关文章:
单元测试中创建多个线程测试 ThreadLocal
单元测试中创建多个线程测试 ThreadLocal 在单元测试中,可以通过以下方式创建多个线程来测试 ThreadLocal 的行为。 目标 验证 ThreadLocal 在多线程环境下是否能正确隔离每个线程的数据。 实现步骤 定义需要测试的类 包含 ThreadLocal 对象的类,提供…...
iDP3复现代码数据预处理全流程(二)——vis_dataset.py
vis_dataset.py 主要作用在于点云数据的可视化,并可以做一些简单的预处理 关键参数基本都在 vis_dataset.sh 中定义了,需要改动的仅以下两点: 1. 点云图像保存位置,因为 dataset_path 被设置为了绝对路径,因此需要相…...
容器化部署服务全流程
系列文章目录 文章目录 系列文章目录前言一、什么是容器?二、如何安装docker三、如何写dockerfile四、如何启动服务五、常见命令总结总结 前言 这篇文章,主要目的是通过容器化技术简化应用程序的部署、运行和管理,提高开发、测试和生产环境…...
Flutter DragTarget拖拽控件详解
文章目录 1. DragTarget 控件的构造函数主要参数: 2. DragTarget 的工作原理3. 常见用法示例 1:实现一个简单的拖拽目标解释:示例 2:与 Draggable 结合使用解释: 4. DragTarget 的回调详解5. 总结 DragTarget 是 Flutt…...
操作系统动态分区分配算法-首次适应算法c语言实现
目录 一、算法原理 二、算法特点 1.优先利用低址空闲分区: 2.查找开销: 3.内存碎片: 三、内存回收四种情况 1.回收区上面(或后面)的分区是空闲分区: 2.回收区下面(或前面)的…...
mybatis-plus自动填充时间的配置类实现
mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…...
Vite内网ip访问,两种配置方式和修改端口号教程
目录 问题 两种解决方式 结果 总结 preview.host preview.port 问题 使用vite运行项目的时候,控制台会只出现127.0.0.1(localhost)本地地址访问项目。不可以通过公司内网ip访问,其他团队成员无法访问,这是因为没…...
【星海随笔】删除ceph
cephadm shell ceph osd set noout ceph osd set norecover ceph osd set norebalance ceph osd set nobackfill ceph osd set nodown ceph osd set pause参考文献: https://blog.csdn.net/lyf0327/article/details/90294011 systemctl stop ceph-osd.targetyum re…...
HarmonyOS NEXT实战:自定义封装多种样式导航栏组件
涉及知识点和装饰器 ComponentV2,Local, Builder,BuilderParam,Extend, Require ,Param,Event等第三方库:ZRouter ,如项目中本来就用了ZRouter路由库,案例中…...
大数据面试笔试宝典之Flink面试
1.Flink 是如何支持批流一体的? F link 通过一个底层引擎同时支持流处理和批处理. 在流处理引擎之上,F link 有以下机制: 1)检查点机制和状态机制:用于实现容错、有状态的处理; 2)水印机制:用于实现事件时钟; 3)窗口和触发器:用于限制计算范围,并定义呈现结果的…...
pytorch整体环境打包安装到另一台电脑上
步骤一:安装conda-pack 首先利用 pip list 指令检查conda环境安装在哪里,在系统环境(base)下,于是我是使用的conda指令完成的。 # 使用Conda安装(如果已安装conda) conda install conda-pack …...
PostgreSQL 数据库连接
title: PostgreSQL 数据库连接 date: 2024/12/29 updated: 2024/12/29 author: cmdragon excerpt: PostgreSQL是一款功能强大的开源关系数据库管理系统,在现代应用中广泛应用于数据存储和管理。连接到数据库是与PostgreSQL进行交互的第一步,这一过程涉及到多个方面,包括连…...
【算法】复杂性理论初步
六、算法复杂性初步 重要的复杂性类 P P P 的定义 多项式时间内可解的问题 若 L ∈ P L∈P L∈P,则存在确定性多项式时间的图灵机 M M M,使得 M ( x ) 1 ⟺ x ∈ L M(x)1⟺x∈L M(x)1⟺x∈L N P NP NP 的定义 多项式时间内可验证验证解的正确性 &…...
HarmonyOS NEXT应用开发实战:免费练手的网络API接口分享
学习一项技能,最好也最快的办法就是直接动手实战。在实战中不断的总结经验和收获成就感。这里分享些好用且免费的网络API练手接口,这对于想要提升自己网络开发能力的开发者来说,无疑是极大的福音。今天,我将详细介绍一个API接口集…...
C++的第一个程序
前言 在学习c之前,你一定还记得c语言的第一个程序 当时刚刚开始进行语言学习 因此告诉到,仅仅需要记住就可以 #include <stdio.h>int main(){printf("Hello World");return 0; }而对于c中的第一个程序,似乎有所变化 C的…...
Java 中 Stream 流的使用详解
Java 中 Stream 流的使用详解 什么是 Stream? Stream 是 Java 8 引入的一种全新的操作集合的方式。它支持通过声明性方式对集合进行复杂的数据操作(如过滤、排序、聚合等),避免使用大量的 for 循环,提高代码的可读性…...
【UE5.3.2】生成vs工程并rider打开
Rider是跨平台的,UE也是,当前现在windows上测试首先安装ue5.3.2 会自动有右键的菜单: windows上,右键,生成vs工程 生成的结果 sln默认是vs打开的,我的是vs2022,可以open with 选择 rider :Rider 会弹出 RiderLink是什么插...
ssh免密码登陆配置
ssh 命令本身不支持直接在命令中带上密码,出于安全考虑,SSH 协议不允许将密码明文写在命令中。直接在命令行中输入密码是一种不推荐的做法,因为它会暴露密码,增加安全风险。 如果你希望实现自动化登录而不手动输入密码࿰…...
Hive之import和export使用详解
在hive-0.8.0后引入了import/export命令。 Export命令可以导出一张表或分区的数据和元数据信息到一个输出位置,并且导出数据可以被移动到另一个hadoop集群或hive实例,并且可以通过import命令导入数据。 当导出一个分区表,原始数据可能在hdf…...
数据库锁的深入探讨
数据库锁(Database Lock)是多用户环境中用于保证数据一致性和隔离性的机制。随着数据库系统的发展,特别是在高并发的场景下,锁的机制变得尤为重要。通过使用锁,数据库能够防止并发操作导致的数据冲突或不一致。本文将深…...
跨平台运行Android应用:APK Installer轻量级解决方案指南
跨平台运行Android应用:APK Installer轻量级解决方案指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 当你需要在非原生环境运行特定应用时,…...
别再只写CRUD了!用SpringBoot拦截器和自定义注解,给你的课程设计项目加上专业的权限控制
从零构建SpringBoot权限控制系统:拦截器与注解实战指南 每次课程设计答辩现场,总能看到这样的场景:学生演示着千篇一律的增删改查功能,评委老师皱着眉头问"权限控制怎么实现的",然后全场陷入尴尬的沉默。如果…...
峰值电流控制模式在开关电源中的动态响应优化策略
1. 峰值电流控制模式的核心原理 我第一次接触峰值电流控制模式是在设计一款手机充电器时。当时被它独特的双环控制结构吸引——就像汽车同时配备油门踏板和定速巡航,既能快速响应路况变化,又能保持稳定车速。这种模式通过实时监测电感电流的峰值来动态调…...
观点_倒计时4年!Gartner重磅发布《2026网络安全6大趋势》,AI失控、量子威胁已逼近企业生命线
观点|倒计时4年!Gartner重磅发布《2026网络安全6大趋势》,AI失控、量子威胁已逼近企业生命线 Gartner 重磅发布 2026 年网络安全六大核心趋势,直指在 AI 技术迭代、量子计算发展与地缘政治相互交织下,网络安全已成为贯穿企业治理…...
5分钟搞定Linux打印机驱动:foo2zjs终极配置指南
5分钟搞定Linux打印机驱动:foo2zjs终极配置指南 【免费下载链接】foo2zjs A linux printer driver for QPDL protocol - copy of http://foo2zjs.rkkda.com/ 项目地址: https://gitcode.com/gh_mirrors/fo/foo2zjs 你是否曾经在Linux系统上为打印机驱动而烦恼…...
.NET源码生成器基于partial范式开发和nuget打包塘
1 安装与初始化 # 全局安装 OpenSpec npm install -g fission-ai/openspeclatest # 在项目目录下初始化 cd /path/to/your-project openspec init 初始化时,OpenSpec 会提示你选择使用的 AI 工具(Claude Code、Cursor、Trae、Qoder 等)。 3 O…...
突破限制:SmokeAPI如何释放Steam游戏全部DLC潜力
突破限制:SmokeAPI如何释放Steam游戏全部DLC潜力 【免费下载链接】SmokeAPI Legit DLC Unlocker for Steamworks 项目地址: https://gitcode.com/gh_mirrors/smo/SmokeAPI 游戏开发者马克在测试新DLC功能时,不得不频繁切换不同Steam账号来验证权限…...
OpenClaw隐私计算:千问3.5-27B本地处理敏感数据对比云端方案
OpenClaw隐私计算:千问3.5-27B本地处理敏感数据对比云端方案 1. 为什么医疗数据需要本地化处理 去年参与某医疗科研项目时,团队需要分析3万份患者电子病历。当我们将数据上传到某商业AI平台后,合规部门紧急叫停——即便已做脱敏处理&#x…...
AudioSwitch:Windows音频设备一键切换与音量管理的终极解决方案
AudioSwitch:Windows音频设备一键切换与音量管理的终极解决方案 【免费下载链接】AudioSwitch Switch between default audio input or output change volume 项目地址: https://gitcode.com/gh_mirrors/au/AudioSwitch 在Windows系统中频繁切换音频设备是否…...
原神智能辅助工具BetterGI:革新游戏体验的开源解决方案
原神智能辅助工具BetterGI:革新游戏体验的开源解决方案 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 - …...
