I agree 100%. Virtual threads have drawn a lot of skepticism but even Rust once had a version with them. They enable the strong structuted concurrency patterns. Async/await works nicely as long as your use case is "do this work on another thread, free this one up, resume here when the async task is done", but I've found that to be most common in UI work, and still not all that common (like if you want to track its progress, you still got some async state management coding to do). And even then you end up with a function coloring problem. People can try to downplay that, bit it is a giant wart resulting from that approach. I'll take Java's virtual threads combined with their structured concurrency efforts over async/await almost every time.