Why do you think it is not M:N scheduling? You have M tasks and N OS threads in the pool?
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.