首页 新闻 会员 周边 捐助

join方法内部实际是wait方法,不能理解的是 在a线程中,b线程调用了join方法,为什么是a线程一直在等待直至b线程结束。

0
悬赏园豆:10 [已解决问题] 解决于 2019-08-03 01:13

join方法内部实际是wait方法,不能理解的是 在a线程中,b线程调用了join方法,为什么是a线程一直在等待直至b线程结束。

问题补充:

在效果上是a一直在等待,但是在代码上有些看不懂, join(long millis)方法里面的wait(0)为什么是a线程调用的?

DDiamondd的主页 DDiamondd | 初学一级 | 园豆:186
提问于:2019-08-02 19:07
< >
分享
最佳答案
0

老铁,你最少要吧代码贴出来啊,不然怎么找问题

收获园豆:10
开心的小草 | 菜鸟二级 |园豆:243 | 2019-08-02 22:09

public static void main(String[] args) throws InterruptedException {
Thread b = new Thread();
b.start();
b.join();
System.out.println("main方法结束");
}
在这里就是main线程里,有一个b线程,b线程调用了join()方法,join()方法内部的wait()方法为什么是作用在了main线程上。
join()源代码:
public final void join() throws InterruptedException {
join(0);
}
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;

    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
        while (isAlive()) {
            wait(0);
        }
    } else {
        while (isAlive()) {
            long delay = millis - now;
            if (delay <= 0) {
                break;
            }
            wait(delay);
            now = System.currentTimeMillis() - base;
        }
    }
}
DDiamondd | 园豆:186 (初学一级) | 2019-08-03 00:16

@DDiamondd: 你这把代码贴出来了就很清楚了啊,我还以为是哪个join呢,
你这个线程的Join的目的就是把当前线程程序加在主线程中,相当于
'''

public static void main(String[] args) throws InterruptedException {
    Thread b = new Thread();
    b.start();
    join();  // join为你的线程函数
    System.out.println("main方法结束");
}

'''
简单的说就是开了线程和没开一样,代码会从上往下一直执行, 如果你就是想开一个线程,去掉b.join()
就好了 那么问题又来了,当去掉join后 主线程和子线程同时进行,当主线程结束是会强迫子线程结束
那么你主线程就一个System.out.println("main方法结束");很肯就会结束,看不出效果,
又两种方法可以看出效果

  1. 加入子线程等待,等待子线程结束了,才退出程序,只不过是主线程跑完等待子线程结束(不推荐,会引起内存泄漏和死机)
  2. 在主线程中加循环,时间足够长就可以看出子线程和主线程的效果了
开心的小草 | 园豆:243 (菜鸟二级) | 2019-08-03 00:33

@开心的小草: 非常感谢您的回复与解答,代码下面的解释都明白,join()的效果也明白,就是在执行的时候,wait()函数怎么就作用在了main函数上面了,从它的源代码上没明白。
还有您回复中的join() 为什么可以替换上面的 b.join()

DDiamondd | 园豆:186 (初学一级) | 2019-08-03 00:53

@开心的小草: 您上面的代码中b.join() --》 join()
是An invocation of this method behaves in exactly the same way as the invocation这个意思吗?(在api中看到的)

DDiamondd | 园豆:186 (初学一级) | 2019-08-03 01:07
其他回答(1)
0

你这逻辑描述混乱啊,到底是Thread_A.Join还是Thead_B.Join

看看https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.thread.join?redirectedfrom=MSDN&view=netframework-4.8#System_Threading_Thread_Join

里面

注解写得很清楚了。

花飘水流兮 | 园豆:13615 (专家六级) | 2019-08-03 00:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册