Join作用
join是定义在Thread类中的方法,作用是阻塞当前线程的执行,等到被调用join的线程对象执行完毕才执行继续执行当前线程。在Java源码中的定义如下:
public final void join() throws InterruptedException {
join(0);
}
public final synchronized void join(long millis) throws InterruptedException
接下来我们先来看看join的简单使用,这样能更好的帮助理解:
public static void main(String[] args) {
Thread thread = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("执行" + Thread.currentThread().getName() + i);
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "thread");
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread() + "执行结束");
}
上面代码的输出结果将会是:
执行thread0
执行thread1
执行thread2
执行thread3
执行thread4
线程Thread[main,5,main]执行结束
所以我们可以看出,主线程执行到join的时候,会被阻塞直到thread这个子线程执行完才继续执行主线程,也就是说,thread.join()方法阻塞调用此方法的线程(callingthread)进入TIMED_WAITING状态,直到线程t完成,此线程再继续。
当我们再回到刚才join方法的源码时,发现最终是调用到
public final synchronized void join(long millis) throws InterruptedException
这个方法,它是无参那个方法的重载。这方法是个同步方法,锁对象是调用join的线程对象本身,为什么要加这个synchronized呢,继续往里看可以看到:
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {