I don't understand what the advantages of it are?
Are Virtual Threads resources that need to be explicitly cleaned up? Can't the pool grow and shrink based on demand?
In Go for example, I don't remember having to clean up fibers manually.
For example, how is the structured concurency example different from:
(defn run-concurrently []
(let [f1 (future (identity 2000))
f2 (future (prn "Starting a long running operation"))
f3 (future (Thread/sleep 1000))
f4 (future (prn "Done."))]
(run! deref [f1 f2 f3 f4])
4))
(run-concurrently)
Also as an FYI, the example can be simplified by using `with-open`.