CompletableFuture
でもJavaではスレッドを積極的に使うのがわりと文化的に普通で、C#のような継続渡しを使った非同期プログラミングは一般的ではない
CompletableFutureでやろうとしてもC#みたいに○○Asyncメソッドが沢山用意されてるわけじゃなくて、全部自分でラップしてやる必要がある
そして、ラップしようとしてもJavaの既存のライブラリはスレッドをブロックするメソッドしかないケースが多いので
supplyAsync(Task.Run相当)だらけになりがちで、実質あまり意味がない(結局スレッドを消費する)
はっきり言って無駄な労力だから諦めてスレッド使うことを強くお勧めする。