RFR: 8378268: Thread.join can wait on Thread, allows joinNanos to be removed

Viktor Klang vklang at openjdk.org
Wed Feb 25 11:05:36 UTC 2026


On Fri, 20 Feb 2026 09:26:52 GMT, Alan Bateman <alanb at openjdk.org> wrote:

> Thread.join was historically implemented with a loop of Object.wait conditioned on isAlive. We couldn't for this virtual threads because it would pin a virtual thread invoking join to it carrier.  Now that Object.wait preempts, it means the special implementation of join for virtual threads can be removed. Where possible, the notifyAll is elided as it adds to the cost of termination.
> 
> The implNote of the join methods is restored (this is implNote text, not spec, so no CSR required).

Great reduction in complexity, Alan 👍

src/java.base/share/classes/java/lang/Thread.java line 1909:

> 1907:         // ensure there is a notifyAll to wake up waiters when this thread terminates
> 1908:         if (this instanceof VirtualThread vthread) {
> 1909:             vthread.beforeJoin();

If deemed valuable, we might be able to do something more sophisticated as the proposed solution will trigger notifyAll even if all joiners bailed out due to timeout.

-------------

PR Comment: https://git.openjdk.org/jdk/pull/29839#issuecomment-3941069215
PR Review Comment: https://git.openjdk.org/jdk/pull/29839#discussion_r2837890985


More information about the core-libs-dev mailing list