【测试框架Junit】强制终止JVM进程

目标:我想要验证一下继承Thread创建的后台线程是否正常运行。
结论:

1、使用junit单元测试创建的后台线程(也就是非守护线程),JVM进程会在执行完单元测试代码后立即退出;

2、使用普通main函数创建的后台线程,JVM会等待后台线程结束;

3、由此得出,常规的单元测试函数,不适合测试多线程逻辑;

java 复制代码
public class CreateThreadWithExtendsThread extends Thread {

    @Override
    public void run(){
        while(true){
            System.out.println("Thread is running, Thread name is " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

// 单元测试
@Test
void contextLoads() throws InterruptedException {
    CreateThreadWithExtendsThread createThreadWithExtendsThread = new CreateThreadWithExtendsThread();
    createThreadWithExtendsThread.start();
}

运行结果是:

bash 复制代码
C:\Users\ourenjiang\.jdks\corretto-17.0.19\bin\java.exe "...
Thread is running, Thread name is Thread-0

进程已结束,退出代码为 0

如果是通过普通main来测试:

java 复制代码
public static void main(String[] args) {
    CreateThreadWithExtendsThread createThreadWithExtendsThread = new CreateThreadWithExtendsThread();
    createThreadWithExtendsThread.start();
}

运行结果是符合预期的:

java 复制代码
C:\Users\ourenjiang\.jdks\corretto-17.0.19\bin\java.exe "...
Thread is running, Thread name is Thread-0
Thread is running, Thread name is Thread-0
Thread is running, Thread name is Thread-0
Thread is running, Thread name is Thread-0

进程已结束,退出代码为 130

如果你直的不想写main函数,可以手动join线程,从而达到阻塞主线程的作用

java 复制代码
// 单元测试
@Test
void contextLoads() throws InterruptedException {
    CreateThreadWithExtendsThread createThreadWithExtendsThread = new CreateThreadWithExtendsThread();
    createThreadWithExtendsThread.start();
}
相关推荐
IT策士5 小时前
Redis 从入门到精通:事务与 Lua 脚本
redis·junit·lua
北极星日淘5 小时前
日淘平台优惠券系统的设计:从规则引擎到防超领
junit
慧都小妮子5 小时前
不想频繁改 PLC?用 DeviceXPlorer Lua 脚本把产线业务逻辑放到 OPC Server 层
java·junit·lua·takebishi·dxpserver·设备数据采集软件·opc server
苏克贝塔7 小时前
.NET开发之.net framework对比.net core
jvm
cfm_29149 小时前
JVM垃圾收集算法与收集器深度解析
jvm·测试工具·算法·性能优化
自律懒人11 小时前
AI Agent 工作流编排实战:从单 Agent 到多 Agent,手搭一套能跑通的协作系统
jvm
石一峰69912 小时前
SQLite 与 db_manager 集成关键概念详解
jvm·数据库·sqlite
布朗克1681 天前
34 JVM深入理解
java·jvm
eggrall1 天前
Linux线程:并发编程的双刃剑
jvm
程序员晨曦1 天前
深入浅出JVM内存结构
jvm·面试·职场和发展