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;}}}
保护性暂停的设计模式:

