Java多线程Day08-多线程之线程join()方法
原创
©著作权归作者所有:来自51CTO博客作者攻城狮Chova的原创作品,请联系作者获取转载授权,否则将追究法律责任
线程的join方法
基本概念
- join() 定义在Thread.java中
- join() 的作用 : 让主线程等待子线程结束之后才能继续运行
join源码
/**
* 等待millis毫秒后线程结束.如果值为0则表示永久等待
*
* 该实现使用循环的wait调用条件为isAlive的方法
* 当一个线程结束时会调用notifyAll方法
* 建议不要在线程实例上使用wait,notify和notifyAll方法
*
* @param millis 以毫秒级的时间等待
* @throws IllegalArgumentException 当millis的值不合法时抛出异常
* @throws InterruptedException 当线程被中断时抛出异常
*/
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;
}
}
}
- 当millis == 0时,会进入while(isAlive()) 循环.只要子线程是活的,主线程就会不停的等待
- 问题: 虽然s.join() 被调用的地方是在主线程中,但是s.join() 是通过子线程s调用的s.join(). 那么join() 方法中的isAlive() 应该是判断子线程s是不是Alive状态.对应的wait(0) 应该是让子线程s等待才对? 这样s.join() 的作用为什么会是让主线程等待直到子线程完成为止呢?
- wait() 的作用是让 [当前线程] 等待
- 这里的 [当前线程] 是指当前在CPU上运行的线程
- 虽然调用的是子线程的wait() 方法,但是是通过主线程去调用的.所以休眠的是主线程而不是子线程
join运行流程
- 在主线程main中通过new ThreadA(“t1”) 新建线程t1
- 通过t1.start() 启动线程t1, 并执行t1.join()
- 执行t1.join() 之后,主线程main进入 [阻塞状态], 等待t1运行结束
- 子线程t1结束之后,会唤醒主线程main, 主线程重新获取CPU执行权,继续运行