来自文档:
join方法允许一个线程等待一个线程完成 其他。如果 t 是一个 Thread 对象,其线程当前正在执行,
t.join();
导致当前线程暂停执行,直到t的线程 终止
我无法理解的是,这是线程上的一种方法,与调用它的方法不同。因此,如果一个线程
t1
调用另一个线程的 t2.join()
,则 t2
对 t1
一无所知。那么到底发生了什么让 t1
等待 t2
完成呢?
通过查看Java源代码:
从 t1 调用 t2.join() 将使 t1 等待 t2 对象(t2 是
Thread
,它是 Object
的子类)。只要 t1 还活着,等待就会永远持续下去。当 t2 线程完成工作时,它会调用 Object.notifyAll()
,因此 t1 会被唤醒。
Thread.join
的经典实现(其他实现也是可能的,就是锁定Thread
对象,测试看看wait
对象是否还活着,如果不是则Thread
)。当线程退出时,它会锁定它的实例并调用 notifyAll
.
选择公共对象作为锁是不幸的。
还有一点额外的信息需要添加。 OpenJDK 确实如此(
join
)
while (isAlive()) {
wait(0);
}
因此,虽然可以导致调用
tx.join
的线程在 tx
完成之前虚假唤醒,但要使其错误地存储在私有 (& tx
)变量。来源评论也谈到了后者:volatile