//比如我们在thread1(下面简称t1)中调用了thread2(下面简称t2).join()方法,t2.join(0)方法 //注意方法被synchronized修饰,所以t1中获取了t2的对象锁 publicfinalsynchronizedvoidjoin(long millis) //默认0,不超时 throws InterruptedException { long base = System.currentTimeMillis(); long now = 0;
if (millis < 0) { thrownew IllegalArgumentException("timeout value is negative"); } // if (millis == 0) { //无限循环判断t2是否存活,否则的话就跳出循环,结束方法 while (isAlive()) { //存活的话调用t2的wait方法 //重点,这里就是释放了t2的对象锁 //因为是在t1方法内调用此方法的,所以也就是让t1无限调用t2.wait,直到t2线程死亡 wait(0); } } else { while (isAlive()) { //逻辑同上,只是加了个超时限制,t2存活时间超过millis,则自动跳出循环,t1线程继续往下走 long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } } }