多线程join()方法

蓝色骨头_cqy 2016-09-06 02:57:35
 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;
}
}
}


最近几天看多线程的时候,看到join方法的用法是用来指定当前主线程等待其他线程执行完毕后,再来继续执行Thread.join()后面的代码。
即主线程创建子线程,,子线程调用join方法,主线程会等待子线程执行完毕或传入的时间片用完,再来执行主线程中join方法后的代码;
翻看join方法源码的时候不太理解,,Thread类中,join方法中的wait()是指主线程wait还是子线程wait,wait的线程如果不被唤醒,如何继续执行;


...全文
389 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
岑如花 2016-09-07
  • 打赏
  • 举报
回复
Wait()方法是让当前线程等待,那么当前线程是谁了,当然是运行在CPU上的线程,那就是在那个线程里写了jion()方法的线程,给楼主推荐篇文章m.jb51.net/article/45634.htm
soton_dolphin 2016-09-07
  • 打赏
  • 举报
回复
引用 5 楼 chen1403876161 的回复:
如果这里的obj是个普通对象,如没有notify唤醒当前线程会一直等待;但如果这个obj是个线程,并且已经调了start方法开始运行了,则会当前线程会等待obj线程执行完之后自动唤醒执行; 但普通对象的wait机制和线程的wait机制有什么不一样呢? 是不是主线程调用子线程的wait方法,当前线程(主线程)阻塞,当子线程运行完毕之后,状态由running转换为dead,主线程会得到通知,然后继续运行?
Oracle 建议不要使用线程的wati(). 可以参考最新的join() API
蓝色骨头_cqy 2016-09-07
  • 打赏
  • 举报
回复
如果这里的obj是个普通对象,如没有notify唤醒当前线程会一直等待;但如果这个obj是个线程,并且已经调了start方法开始运行了,则会当前线程会等待obj线程执行完之后自动唤醒执行; 但普通对象的wait机制和线程的wait机制有什么不一样呢? 是不是主线程调用子线程的wait方法,当前线程(主线程)阻塞,当子线程运行完毕之后,状态由running转换为dead,主线程会得到通知,然后继续运行?
蓝色骨头_cqy 2016-09-07
  • 打赏
  • 举报
回复
引用 3 楼 soton_dolphin 的回复:
[quote=引用 2 楼 chen1403876161 的回复:] 子线程wait?子线程wait了,那子线程如何执行呢?
在主线程里执行 t.wait() 的可以理解为, 主线程对子线程说:我把我放到你的等待队列里去了,如果你执行完了就通知我(notifyAll()). 或者是t.wait(miliseconds), 主线程对子线程说: 我把我加到你的等待队列里去了,过这么多时间(MILISECONDS)之后通知我,或者在这个时间之前你执行完了就通知我。当子线程结束执行以后,会自动发出notifyAll的通知。[/quote] 刚刚写了几个demo,的确如楼上所说;简单总结一下:
synchronized (obj) {
			try {
				obj.wait();
				....do something...
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
如果这里的obj是个普通对象,如没有notify唤醒当前线程会一直等待;但如果这个obj是个线程,并且已经调了start方法开始运行了,则会当前线程会等待demo线程执行完之后自动唤醒执行; 但普通对象的wait机制和线程的wait机制有什么不一样呢? 是不是主线程调用子线程的wait方法,当子线程运行完毕之后,状态由running转换为dead,主线程会得到通知?
soton_dolphin 2016-09-06
  • 打赏
  • 举报
回复
引用 2 楼 chen1403876161 的回复:
子线程wait?子线程wait了,那子线程如何执行呢?
在主线程里执行 t.wait() 的可以理解为, 主线程对子线程说:我把我放到你的等待队列里去了,如果你执行完了就通知我(notifyAll()). 或者是t.wait(miliseconds), 主线程对子线程说: 我把我加到你的等待队列里去了,过这么多时间(MILISECONDS)之后通知我,或者在这个时间之前你执行完了就通知我。当子线程结束执行以后,会自动发出notifyAll的通知。
蓝色骨头_cqy 2016-09-06
  • 打赏
  • 举报
回复
子线程wait?子线程wait了,那子线程如何执行呢?
soton_dolphin 2016-09-06
  • 打赏
  • 举报
回复
wait(long timeout) 这个wait是子线程的wait(), 如果超过了这个时间,主线程就当做子线程已经结束执行,所以就会继续执行主线程的代码。 其实join就两个条件完成执行:1. 设定的超时时间到了:2, 子线程完成执行,isAlive()变成false

62,634

社区成员

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

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