目录
1.join的作用就是,调用join的线程等一等,等我跑完,你再继续跑。
3.跳转到2114行 可以看到这里就是处理join方法的编辑
4.跳转到ensure_join 中,可以看到这里会notify所有持有本线程锁的线程。编辑
1.join的作用就是,调用join的线程等一等,等我跑完,你再继续跑。
通常用在比如主线程登录子线程跑完再跑。
那么原理如何呢? 看源码可以看到实际上是调用的wait()方法。
public final synchronized void join(long var1) throws InterruptedException {
long var3 = System.currentTimeMillis();
long var5 = 0L;
if (var1 < 0L) {
throw new IllegalArgumentException("timeout value is negative");
} else {
if (var1 == 0L) {
while(this.isAlive()) {
this.wait(0L);
}
} else {
while(this.isAlive()) {
long var7 = var1 - var5;
if (var7 <= 0L) {
break;
}
this.wait(var7);
var5 = System.currentTimeMillis() - var3;
}
}
}
}
那么有个疑问了:这里调用wait(),那什么时候notify的呢?
2.我们看到 线程退出都干了什么
3.跳转到2114行 可以看到这里就是处理join方法的![](https://i-blog.csdnimg.cn/blog_migrate/76eb4eb3d59711892d02374a8b705119.png)
4.跳转到ensure_join 中,可以看到这里会notify所有持有本线程锁的线程。![](https://i-blog.csdnimg.cn/blog_migrate/d3b6774b20539f68ca4477faefde26d4.png)
5.懂!!!写个代码验证下
package com.myeye.ssm.controller;
import java.util.concurrent.TimeUnit;
/**
* @description:
* @author: yk
* @time: 2022/5/24 13:52
*/
public class dd {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
System.out.println("111111111");
});
Thread thread2 = new Thread(() -> {
try {
thread.join();
synchronized (thread){
thread.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("222222222222222");
});
thread2.start();
thread.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("333333333333333");
}
}