join方法内部实际是wait方法,不能理解的是 在a线程中,b线程调用了join方法,为什么是a线程一直在等待直至b线程结束。
在效果上是a一直在等待,但是在代码上有些看不懂, join(long millis)方法里面的wait(0)为什么是a线程调用的?
老铁,你最少要吧代码贴出来啊,不然怎么找问题
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: 你这把代码贴出来了就很清楚了啊,我还以为是哪个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方法结束");很肯就会结束,看不出效果,
又两种方法可以看出效果
@开心的小草: 非常感谢您的回复与解答,代码下面的解释都明白,join()的效果也明白,就是在执行的时候,wait()函数怎么就作用在了main函数上面了,从它的源代码上没明白。
还有您回复中的join() 为什么可以替换上面的 b.join()
@开心的小草: 您上面的代码中b.join() --》 join()
是An invocation of this method behaves in exactly the same way as the invocation这个意思吗?(在api中看到的)
你这逻辑描述混乱啊,到底是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
里面
注解写得很清楚了。