join原理:
join的底层使用到了保护性暂停的设计模式
源码:
public final synchronized void join(long millis)
throws InterruptedException {
//记录最初时间
long base = System.currentTimeMillis();
//记录已经经历的时间
long now = 0;
//传入的时间小于0,抛异常
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
//等于0就是一直等待,调用wait(0)
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
//delay表示传入的参数减去已经经历的时间,小于0就结束
long delay = millis - now;
if (delay <= 0) {
break;
}
//将delay设置为参数,防止唤醒错误的问题
wait(delay);
//判断已经经历的时间
now = System.currentTimeMillis() - base;
}
}
}