Why do you think it is not M:N scheduling? You have M tasks and N OS threads in the pool?
With tasks/futures you supposed to submit another task to pool which will wake up after certain time.
Both are "green threads" with manual scheduler (you need to make explicit call to give up control to scheduler) but different API.
When a virtual thread sleeps or blocks on IO it is unhooked from the underlying platform thread so another virtual thread can run. You can have an almost unlimited number of virtual threads multiplexed over a small number of carrier (platform) threads. Hence M:N
Java already had tons of non-blocking io/http and many other frameworks without "green threads" but using futures and executionservice. Green threads look like syntactic sugar.
I say that as someone who once had a Solaris Internals book (and worked at Sun in that area), and it would be pretty great for that book's explanation to be online for Java people who didn't use original green threads to see.