Розбираємо запуск і композицію асинхронних обчислень за допомогою
CompletableFuture: як стартувати завдання через
supplyAsync і
runAsync, чим відрізняються обробники
thenApply,
thenAccept,
thenRun, і коли обирати їх асинхронні версії
thenApplyAsync/
thenAcceptAsync/
thenRunAsync. Поговоримо про потоки виконання (
ForkJoinPool або ваш
Executor), типи результатів (
CompletableFuture<T>,
CompletableFuture<Void>) і типові помилки: блокувальні виклики
get()/
join(), необроблені помилки без
exceptionally/
handle/
whenComplete, а також спроба використати результат усередині
thenRun.