欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 主线程结束子线程不再执行

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

2025/5/13 15:46:37 来源:https://blog.csdn.net/m0_59925573/article/details/140254674  浏览:    关键词:主线程结束子线程不再执行

问题背景:

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

问题结论:

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

问题过程:

原始代码:

@Testpublic 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;}@Overridepublic void run() {boolean lock = locker.lock();System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));}}

修改后代码:

@Testpublic 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;}@Overridepublic void run() {boolean lock = locker.lock();System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));}}

注释:

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词