主线程结束子线程不再执行

问题背景:

起因是在做分布式锁的时候,我在单元测试里面创建了10个线程,然后启动。每个线程都会在run方法打印内容,但是测试结果居然什么都没输出。就很纳闷,然后推测可能是主线程执行完了子线程直接结束了,果不其然,在加上thread.join()得到了预期结果。

问题结论:

如果是写在main方法是不存在这个问题的,但是单测的确存在这个问题。

问题过程:

原始代码:

java 复制代码
@Test
    public void multipleThreadTest(){
        System.out.println(Thread.currentThread().getName());
        LockThread[] lockThreads = new LockThread[10];
        for (int i=0;i< lockThreads.length;i++){
            lockThreads[i] = new LockThread(new ZkNodeNoneBlockingLock("app"));
        }
        for (LockThread lockThread : lockThreads) {
            lockThread.start();
        }
    }

    private static class LockThread extends Thread{
        ZkNodeNoneBlockingLock locker;
        public LockThread(ZkNodeNoneBlockingLock locker){
            this.locker = locker;
        }
        @Override
        public void run() {
            boolean lock = locker.lock();
            System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));
        }
    }

修改后代码:

java 复制代码
@Test
    public void multipleThreadTest(){
        System.out.println(Thread.currentThread().getName());
        LockThread[] lockThreads = new LockThread[10];
        for (int i=0;i< lockThreads.length;i++){
            lockThreads[i] = new LockThread(new ZkNodeNoneBlockingLock("app"));
        }
        for (LockThread lockThread : lockThreads) {
            lockThread.start();
        }
        for (LockThread lockThread : lockThreads){
            try {
                lockThread.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    private static class LockThread extends Thread{
        ZkNodeNoneBlockingLock locker;
        public LockThread(ZkNodeNoneBlockingLock locker){
            this.locker = locker;
        }
        @Override
        public void run() {
            boolean lock = locker.lock();
            System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));
        }
    }

注释:

thread.join()是当前线程,也就是main线程要等到thread线程执行完成才能继续往后执行。

相关推荐
冷咖啡离 我的笨笨1 天前
HttpContext.Current并非无处不在
log4j
5系暗夜孤魂z5 天前
优雅的.net REST API之FastEndpoints
log4j·.net
名字还没想好☜5 天前
Go 表驱动测试实战:用 t.Run 子测试组织可维护的单元测试
golang·单元测试·log4j·go·testing
老白干5 天前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
森叶7 天前
用 DataTransfer 模拟“用户选择本地文件“:不用系统对话框,也能给 `<input type=“file“>` 塞进真实文件
java·开发语言·log4j
2601_9647028913 天前
Claude Opus 5 API 新手指南:从零搭建第一个 AI 应用
人工智能·log4j
测试修炼手册16 天前
[测试技术] TestNG 入门与实战:分组、数据驱动与并行执行
junit·单元测试·log4j
在水一缸17 天前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
风向决定发型d78220 天前
Github Copilot 实战应用与效能提升指南
log4j·github·copilot
AI大模型-小雄24 天前
充值Codex + GPT-5.5 并发 Bug 调试实战:从时序分析到回归测试
gpt·log4j·bug