Некоторые ключевые различия между Java CompletableFuture и Java Future:
- Блокирование. 13 Future использует блокирующий подход: метод get() блокирует вызывающий поток до завершения задачи. 13 CompletableFuture работает в неблокирующем режиме: основной поток не блокируется в ожидании результата. 1
- Поддержка коллбэков. 1 Future не позволяет прикреплять коллбэки, которые определяют, что делать после завершения вычисления. 1 CompletableFuture обеспечивает полную поддержку цепочек задач: можно прикреплять различные коллбэки, чтобы определять, что должно происходить после завершения задачи, без блокировки основного потока. 1
- Обработка исключений. 1 Future не имеет встроенного механизма обработки исключений. 1 CompletableFuture предлагает более надёжную обработку исключений с помощью методов, таких как exceptionally() и handle(). 1
- Композиция результатов. 1 Future не позволяет объединять несколько экземпляров Future или цепочки задач. 1 CompletableFuture позволяет легко комбинировать асинхронные задачи с помощью методов, таких как thenCompose(), thenCombine(), или запускать несколько задач параллельно с allOf(). 1
- Поддержка асинхронного выполнения. 1 Для асинхронного выполнения задач Future необходимо использовать ExecutorService, что добавляет некоторые накладные расходы. 1 CompletableFuture имеет встроенную поддержку асинхронного выполнения: методы, такие как supplyAsync() и runAsync(), позволяют запускать задачи асинхронно без необходимости явно управлять ExecutorService. 1
Таким образом, Future подходит для простых асинхронных задач, где допустимо блокирование, а CompletableFuture — для более сложных асинхронных рабочих процессов, требующих неблокирующего поведения, обработки ошибок и композиции задач. 13