java 中线程join的实现原理

TinySun 2016-02-18 11:10:24
java中,join的实现是通过调用线程的wait()方法来实现的。

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;
}
}
}

那么,线程A调用了线程B的join方法,相当于是调用了B的wait()方法,那么,问题来了:
1、调用了B的wait方法之后,线程B不是应该进入等待状态么?为什么还会往下执行?
2、A线程调用了B线程的join方法后就阻塞了,B线程wait之后,没有其他地方显示的调用线程B的signal方法, 他是怎么从wait状态恢复的?
...全文
515 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cools_boys 2017-08-21
  • 打赏
  • 举报
回复
A线程在其start方法里执行唤醒
结贴是美德 2016-02-21
  • 打赏
  • 举报
回复
引用 2 楼 zyy5411 的回复:
[quote=引用 1 楼 Q80470101 的回复:]
在线程A中调用了线程B的Join()方法,是A线程进入wait状态,直到线程B执行完毕后,才会继续执行线程A。
参考资料及源码解释:
http://uule.iteye.com/blog/1101994

恩,之前理解上有点问题,调用了Join之后,A进入wait状态,那A需要有notify才能够唤醒,但并没有看到这个notify。难道线程B执行结束后,所有wait在线程B上的线程都会被唤醒?[/quote]



引用
This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked.


你猜对了。可以看看源码,但我感觉首先你要读一读API文档,看看join方法的API doc说了啥。
TinySun 2016-02-19
  • 打赏
  • 举报
回复
引用 1 楼 Q80470101 的回复:
在线程A中调用了线程B的Join()方法,是A线程进入wait状态,直到线程B执行完毕后,才会继续执行线程A。 参考资料及源码解释: http://uule.iteye.com/blog/1101994
恩,之前理解上有点问题,调用了Join之后,A进入wait状态,那A需要有notify才能够唤醒,但并没有看到这个notify。难道线程B执行结束后,所有wait在线程B上的线程都会被唤醒?
家里敷泥呀 2016-02-19
  • 打赏
  • 举报
回复
在线程A中调用了线程B的Join()方法,是A线程进入wait状态,直到线程B执行完毕后,才会继续执行线程A。 参考资料及源码解释: http://uule.iteye.com/blog/1101994

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧