Can you cite the document that claims that the Loom project was supposed to be finished 3 years ago? The earliest reference I can find shows that the project began 4 years ago. http://cr.openjdk.java.net/~rp...
The key difficulty is maintaining full backwards compatibility and working with all the tooling that has been developed over the years. Golang has the luxury of being new, and so new features can be added quickly without breaking anything. In the early days of Java, features were being added at a much more rapid pace then they are now. The slower pace is just due to the maturity of the language.
Also, it duplicates thread scheduling functions between the OS and the VM runtime. And you run into the question of where to put the stacks for all those lightweight threads, and how to grow them.
The Loom project relies on the existing fork/join pool, which is also heavily used by all the popular Java async frameworks. When a virtual thread needs to block, it transfers stack state to a heap-allocated continuation object, and so growth is managed by the existing GC facilities. In essence, Loom is automating the process of converting thread-based code to async-based code.
8 Catfish = 1 Octo-puss