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

问题背景:

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

相关推荐
醇氧11 小时前
【学习】软件过程模型全解析:从瀑布到敏捷的演进之路
学习·log4j
WiChP4 天前
【V0.1B6】从零开始的2D游戏引擎开发之路
java·log4j·游戏引擎
__zRainy__5 天前
Node.js 日志选型指南:Winston vs Log4js 全方位对比与实战
node.js·log4j·winston
希望永不加班10 天前
SpringBoot 集成测试:@SpringBootTest 与 MockMvc
java·spring boot·后端·log4j·集成测试
Howrun77714 天前
C++ 项目测试全指南:从 0 基础到落地实操
开发语言·c++·log4j
admin and root16 天前
从资产收集FUZZ接口到SQL注入案例
网络·数据库·sql·安全·web安全·渗透测试·log4j
Joy T16 天前
【Web3】智能合约质量保障工程:从单元测试到 Gas 效能优化
单元测试·log4j·web3·智能合约·hardhat
sg_knight18 天前
使用 Claude Code 写单元测试的实战方法
单元测试·log4j·ai编程
sthnyph19 天前
SpringBoot Test详解
spring boot·后端·log4j
brucelee18619 天前
Spring Boot 测试最佳实践
spring boot·后端·log4j