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

问题背景:

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

问题结论:

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

问题过程:

原始代码:

@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 ? "上锁成功" : "上锁失败"));
        }
    }

修改后代码:

@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. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 18:12:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 18:12:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 18:12:02       58 阅读
  4. Python语言-面向对象

    2024-07-11 18:12:02       69 阅读

热门阅读

  1. 手写函数柯里化示例

    2024-07-11 18:12:02       18 阅读
  2. 常微分方程的离散化

    2024-07-11 18:12:02       23 阅读
  3. Linux下解压.tar.gz文件

    2024-07-11 18:12:02       17 阅读
  4. 利用nodejs实现简单的静态文件托管

    2024-07-11 18:12:02       15 阅读
  5. 力扣题解( 最长递增子序列)

    2024-07-11 18:12:02       24 阅读
  6. less和sass有啥区别哪个更加好

    2024-07-11 18:12:02       21 阅读
  7. 7.10飞书一面面经

    2024-07-11 18:12:02       23 阅读