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


    问题背景:

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

    问题结论:

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

    问题过程:

    原始代码:

    1. @Test
    2. public void multipleThreadTest(){
    3. System.out.println(Thread.currentThread().getName());
    4. LockThread[] lockThreads = new LockThread[10];
    5. for (int i=0;i< lockThreads.length;i++){
    6. lockThreads[i] = new LockThread(new ZkNodeNoneBlockingLock("app"));
    7. }
    8. for (LockThread lockThread : lockThreads) {
    9. lockThread.start();
    10. }
    11. }
    12. private static class LockThread extends Thread{
    13. ZkNodeNoneBlockingLock locker;
    14. public LockThread(ZkNodeNoneBlockingLock locker){
    15. this.locker = locker;
    16. }
    17. @Override
    18. public void run() {
    19. boolean lock = locker.lock();
    20. System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));
    21. }
    22. }

    修改后代码:

    1. @Test
    2. public void multipleThreadTest(){
    3. System.out.println(Thread.currentThread().getName());
    4. LockThread[] lockThreads = new LockThread[10];
    5. for (int i=0;i< lockThreads.length;i++){
    6. lockThreads[i] = new LockThread(new ZkNodeNoneBlockingLock("app"));
    7. }
    8. for (LockThread lockThread : lockThreads) {
    9. lockThread.start();
    10. }
    11. for (LockThread lockThread : lockThreads){
    12. try {
    13. lockThread.join();
    14. } catch (InterruptedException e) {
    15. throw new RuntimeException(e);
    16. }
    17. }
    18. }
    19. private static class LockThread extends Thread{
    20. ZkNodeNoneBlockingLock locker;
    21. public LockThread(ZkNodeNoneBlockingLock locker){
    22. this.locker = locker;
    23. }
    24. @Override
    25. public void run() {
    26. boolean lock = locker.lock();
    27. System.out.println(this.getName() + (lock ? "上锁成功" : "上锁失败"));
    28. }
    29. }

    注释:

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

  • 相关阅读:
    一个print函数,挺会玩啊?
    [清爽快捷]一条命令解决国内访问github超时For Linux、MAC 、Windows
    事务_基本演示和事务_默认自动提交&手动提交
    vue原生实现element上传多张图片浏览删除
    什么是代码签名证书中的“硬证书”?
    LLM实战:LLM微调加速神器-Unsloth + LLama3
    Flutter 小白之旅---基础知识篇
    Spring AOP 超详细源码解析
    HANA SQL 的Union和Union All
    全栈项目【尚医通】预约挂号系统项目介绍
  • 原文地址:https://blog.csdn.net/m0_59925573/article/details/140254674