"Cannot" seems a bit harsh. CompletableFuture isn't going away, and is made for callback situations.
With green threads being "free" (you can have millions), it might be reasonable to just block your green thread until the callback arrives.
With green threads being "free" (you can have millions), it might be reasonable to just block your green thread until the callback arrives.
The nice thing about promise-based async is that it's very easy to map to straight C ABI callbacks, which means that it can be fully cross-language. Green threads are runtime-specific.