Behaviour of fork() after scope closing (was "When should I use onFork?")

Alan Bateman alan.bateman at oracle.com
Sun Aug 24 16:15:06 UTC 2025


On 24/08/2025 16:06, David Alayachew wrote:
> Thanks for the context Alan and Viktor. I guess since Virtual Threads 
> kick off tasks so fast (due to their throughput), I never had a chance 
> to observe this behaviour.
>
> But I think I get it -- once the scope closes, all future calls to 
> fork() fail, so onFork() simply doesn't get called.

If you stick to try-with-resources and open the STS in the 
resource-specification, e.g. try (var scope = 
StrcuturedTaskScope.open(..)) { }, then the local variable will not be 
in scope in code that follows the try-with-resources statement. This 
makes it hard to even attempt to fork after the STS has been closed. If 
a reference does escape then it just means that calling fork after the 
close will throw IllegalStateException.


>
> That is a very important detail though. Hope you don't mind, but let 
> me change subject to make sure I understand this behaviour.
>
> For example, let's say I use the anySuccessfulOrThrow Joiner. Then, 
> theoretically speaking, if I have enough tasks such that by the time 
> the scope closes, I am still feeding tasks into fork(), then my scope 
> will fail? Am I understanding that correctly?
>
This is cancellation rather than closing. It's okay for the scope to be 
cancelled during the "forking phase". Once cancelled, it just means that 
fork returns a subtask (UNAVAILABLE state) without starting a thread to 
execute it. The StrcuturedTaskScope::isCancelled method can be used to 
avoid doing unnecessary work in a lengthy forking phase (there's an API 
note in the isCancelled method on this).

-Alan.




More information about the loom-dev mailing list