В Java 8 есть два способа запуска асинхронных вычислений — CompletableFuture
и ForkJoinTask
. Они оба кажутся довольно похожими — внутренние классы CompletableFuture
даже расширяют ForkJoinTask
.
Есть ли причина использовать один над другим?
Одно ключевое отличие, которое я вижу, заключается в том, что метод CompletableFuture.join
просто блокируется до тех пор, пока будущее не будет завершено (waitingGet
просто вращается с использованием ManagedBlocker
), тогда как ForkJoinTask.join
может украсть работу из очереди, чтобы помочь выполнить задачу, к которой вы присоединяетесь.
Есть ли преимущество перед тем или иным?