Java多线程join

  • 让“主线程”等待“子线程”结束之后才能继续运行。
// 主线程
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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容