⭐⭐⭐解析Thread.join底层源码,分析如何保证调用它的线程实现插队功能🌙🌙🌙
1、Thread.join方法加了synchronized关键字,为了和后面的wait(0)搭配使用;
2、使用while循环检测调用join方法的插队线程是否还在运行,若还在运行,就调用wait(0)方法,假装释放锁后去排队了,其实时间参数传入的是0,也就是没去排队,还会继续循环执行这套逻辑;
3、直到调用join的插队线程执行完毕die了,才会从循环中跳出,这时才算插队结束,才会回到被插队的线程中继续执行
如此这般,就实现了插队功能。
public final synchronized void join(long millis)//配合wait(0)搭配使用
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {//检测当前调用join方法的线程是否存活
wait(0);//虚晃一枪
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}