好菜哦 2020-05-19 10:55 采纳率: 0%
浏览 484

Java中线程的join()方法,为什么是主线程等待,而不是调用join()方法的线程等待?

public class ThreadMethods {

    public static void main(String[] args) {
        //继承Runnable
        Runnable r = new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName()+"执行完毕!");
            }
        };
        //创建线程对象
        Thread t1 = new Thread(r,"t1");
        //启动线程
        t1.start();
        try {
            /*中断主线程,让t1线程先执行。
             *我疑惑的就是这里,是t1对象调用的join()方法,进入join()方法源码中,有一段代码:
             *if (millis == 0) {
                    while (isAlive()) {
                        wait(0);
                    }
                }
             * 这里判断isalive(),等价于t1.isAlive(),结果为true,然后调用t1.wait(0)方法,
             * 既然是t1调用的wait(0)方法,不是应该让t1等待吗?为什么结果是主线程(mian)等待呢?
             * */
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程执行完毕!");
    }
}

结果:
t1执行完毕!
主线程执行完毕!

  • 写回答

1条回答 默认 最新

  • Y_vocefenrir 2020-05-19 13:57
    关注

    这个代码你好像理解错了。

    • 在调用join不传参数的时,它就是确保调用join的线程先执行,核心是isAlive(),只有当调用者的线程结束后,才会执行下边的代码。
    • 在调用join传入参数的时候,例如 a.join(100) , 他表示,此处我会等待100毫秒,先让a线程执行,100毫秒后,无论a 是否执行完成,都会执行后续代码。

    可以用下面代码理解一下
    public class ThreadT extends Thread {
    private Thread t;

    public ThreadT() {
    }
    
    public ThreadT(Thread t) {
        this.t = t;
    }
    
    @Override
    public void run() {
        try {
            if(t != null) {
                t.join();
            }
            Thread.sleep(2000);
            System.out.println(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    

    }

    public class ThreadTest {
    
        public static void main(String[] args) throws InterruptedException {
            ThreadT threadT = new ThreadT();
            threadT.start();
            threadT.join(1000);
            System.out.println(2);
        }
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向