- 让“主线程”等待“子线程”结束之后才能继续运行。
// 主线程
public class Father extends Thread {
public void run() {
Son s = new Son();
s.start();
s.join();
...
}
}
// 子线程
public class Son extends Thread {
public void run() {
...
}
}
流程图

join流程.png
join()里面,有一个wait方法,指的是让当前线程wait()
public final void join(long millis) throws InterruptedException {
synchronized(lock) {
if (millis == 0) {
while (isAlive()) {
lock.wait(0);
}
} else {
……
}
}
问题:Thread2执行完之后怎么唤醒Thread1?
原来在线程结束时,java虚拟机会执行该线程的本地exit方法,
//线程退出函数:
void JavaThread::exit(bool destroy_vm, ExitType exit_type) {
...
//这里会处理join相关的销毁逻辑
ensure_join(this);
...
}
//处理join相关的销毁逻辑
static void ensure_join(JavaThread* thread) {
Handle threadObj(thread, thread->threadObj());
ObjectLocker lock(threadObj, thread);
thread->clear_pending_exception();
java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED);
java_lang_Thread::set_thread(threadObj(), NULL);
//这里就调用notifyAll方法,唤醒等待的线程
lock.notify_all(thread);
thread->clear_pending_exception();
}
参考:
https://www.cnblogs.com/skywang12345/p/3479275.html
https://blog.csdn.net/hesong1120/article/details/64906716