thread.join() 从概念上讲是如何工作的?

问题描述 投票:0回答:3

来自文档:

join方法允许一个线程等待一个线程完成 其他。如果 t 是一个 Thread 对象,其线程当前正在执行,

t.join();

导致当前线程暂停执行,直到t的线程 终止

我无法理解的是,这是线程上的一种方法,与调用它的方法不同。因此,如果一个线程

t1
调用另一个线程的
t2.join()
,则
t2
t1
一无所知。那么到底发生了什么让
t1
等待
t2
完成呢?

java multithreading
3个回答
2
投票

通过查看Java源代码:

从 t1 调用 t2.join() 将使 t1 等待 t2 对象(t2 是

Thread
,它是
Object
的子类)。只要 t1 还活着,等待就会永远持续下去。当 t2 线程完成工作时,它会调用
Object.notifyAll()
,因此 t1 会被唤醒。


1
投票

Thread.join
的经典实现(其他实现也是可能的,就是锁定
Thread
对象,测试看看
wait
对象是否还活着,如果不是则
Thread
)。当线程退出时,它会锁定它的实例并调用
notifyAll
.

选择公共对象作为锁是不幸的。


0
投票

还有一点额外的信息需要添加。 OpenJDK 确实如此(

join

                while (isAlive()) {
                    wait(0);
                }

因此,虽然可以导致调用

tx.join
的线程在
tx
完成之前虚假唤醒,但要使其错误地存储在私有 (&
 tx
)变量。来源评论也谈到了后者:
volatile

	
© www.soinside.com 2019 - 2024. All rights reserved.