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

问题背景:

起因是在做分布式锁的时候,我在单元测试里面创建了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线程执行完成才能继续往后执行。

相关推荐
垚森16 小时前
【问题解决】关于log4j与logback依赖冲突的解决方案
log4j·logback·问题解决·依赖冲突
GA6666661 天前
2026 年自托管 Wiki 推荐:为什么选择 PowerWiki
人工智能·log4j·blog·wiki
cike_y3 天前
Mybatis之分页的实现&日志工厂&Log4j详解
数据库·log4j·mybatis
Lisonseekpan4 天前
RBAC 基于角色的访问控制模型详解与实践指南
java·服务器·网络·后端·spring·log4j
川石课堂软件测试4 天前
软件测试的白盒测试(二)之单元测试环境
开发语言·数据库·redis·功能测试·缓存·单元测试·log4j
Lisonseekpan5 天前
Spring Boot Email 邮件发送完全指南
java·spring boot·后端·log4j
许泽宇的技术分享8 天前
AgentFramework:测试方法
log4j
墨痕诉清风10 天前
java漏洞集合工具(Struts2、Fastjson、Weblogic(xml)、Shiro、Log4j、Jboss、SpringCloud)
xml·java·struts·安全·web安全·spring cloud·log4j
Lisonseekpan10 天前
为什么Spring 推荐使用构造器注入而非@Autowired字段注入?
java·后端·spring·log4j
brave and determined11 天前
CANN训练营 学习(day10)昇腾AI算子ST测试全攻略:从入门到精通
自动化测试·人工智能·log4j·算子·fuzz·测试实战·st测试