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


    问题背景:

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

  • 相关阅读:
    探索Elasticsearch的核心个问题
    编程语言是都一样的,吗?
    DC电源模块工作效率的特点
    web前端期末大作业【足球网页】学生网页设计作业源码
    泛型的学习
    leetcode — JavaScript专题(八):间隔取消、使用方法链的计算器、判断对象是否为空、记忆函数 II、设计可取消函数
    ResNet分类器量化
    数据链路层:封装成帧
    vscode 输入 npm install 报错: node-sass@8.0.0 install: `node scripts/install.js`
    制造业如何数字化转型?
  • 原文地址:https://blog.csdn.net/m0_59925573/article/details/140254674