How does Project Loom in JDK 21 change this?
It seems that Java has expended a lot of effort in implementing low cost virtual threads including all the effort needed to make async truly async throughout the Java runtime library.
Is this true? Wouldn't they still consume an OS thread in that case; possibly consuming the pool of OS threads that are servicing the virtual threads?
How does loom handle that?
Regardless of any future updates, this class will probably always use a thread pool/ExecutorService. It is part of the documented behaviour and API.
That said, it's on their wiki as something they plan to address. Virtual threads aren't the end of the dev work here.