get() и join() в CompletableFuture в Java: разница и влияние
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для эффективности и избежания обработки проверяемых исключений используйте CompletableFuture.join()
. Этот метод порождает непроверяемые исключения CompletionException
, и идеален для сохранения лаконичности лямбда-выражений и потоков.
CompletableFuture.get()
используйте в ситуациях, где нужен контроль над исключениями, так как этот метод генерирует проверяемые исключения ExecutionException
и InterruptedException
, обработка которых должна быть явно указана.
String resultJoin = CompletableFuture.supplyAsync(() -> {/* 👀 Без рук, мама! */ return "Result";}).join(); // Непроверяемые исключения
String resultGet; // Проверяемые исключения
try {
resultGet = CompletableFuture.supplyAsync(() -> {/* 🎓 Логика учёного */ return "Result";}).get();
} catch (ExecutionException | InterruptedException e) {
throw new RuntimeException(e); // 🎾 И вот мы здесь!
}
join() или get(): Баланс между решениями дизайнера
Когда вы на распутье между join()
и get()
, учитывайте последствия каждого метода. join()
обеспечивает простоту использования, в то время как get()
даёт вам гибкость, позволяя устанавливать таймауты и обрабатывать прерывания потока.
Прерываемость, временные задержки и стратегические решения:
get()
обладает функцией временной задержки перед повторными попытками, используя при этом методы, такие какget(long timeout, TimeUnit unit)
.get()
позволяет прервать выполнение, что проявляет свою полезность в реальных условиях, когда потоки возможно освободить для выполнения других задач.
Обработка исключений: Управление непредсказуемостью
exceptionally()
в сочетании сjoin()
дает возможность прозрачно обрабатывать исключения, придерживаясь функционального стиля.- Использование
get()
, несмотря на кажущуюся сложность, обеспечивает более детальное управление исключениями.
Подходы и стиль кода – Умение влиять на работу компьютера
И join()
, и get()
обеспечивают одинаковую производительность, но их уникальные способы обработки исключений формируют различные практические особенности.
Тащим на join() покрывало : Свобода в работе
join()
дает возможность создания последовательности асинхронных задач без риска пропущенных исключений.join()
используйте ради лаконичности кода, особенно в лямбда-выражениях или методах ссылок.
Отдаем предпочтение get(): Традиция и надёжность
- Благодаря
get()
вы можете точно понимать причины сбоев, распознаваяExecutionException
иInterruptedException
. get()
превосходно подойдет для устаревшего кода, где обновление способа обработки исключений потребует длительной адаптации.
Продвинутая обработка исключений: На шаг впереди
CompletableFuture
расширяет ваши возможности обработки исключений за счет метода handle()
, который предоставляет вам и результат, и исключение одновременно. С помощью whenComplete()
, вы сможете выполнять операции независимо от результата, что предлагает детализированный и контролируемый способ обработки исключений.
Визуализация
Давайте представим разницу между join()
и get()
в CompletableFuture<T>
как две дороги к одной и той же цели:
Комната с сокровищами (🏆): Результат выполнения CompletableFuture
Маршрут join()
(🚪🤝):
- Если по пути встретите замок (Исключение), он автоматически откроется (бросает непроверяемое исключение).
- Проход прост и прям, не требует дополнительных забот о предупреждении о препятствиях (непроверяемые исключения не требуют объявления).
Тропа get()
(🚪🔑):
- Нужно иметь ключ (обработка исключений) для входа, иначе останетесь снаружи (генерирует проверяемые исключения).
- Требует уведомления о возможных сложностях (проверяемые исключения должны быть объявлены или обработаны).
Оба пути ведут к цели, но каждый требует своей стратегии.
join() или get() – Кого назначить победителем?
Ни один из методов не обладает преимуществом в производительности, поэтому ваша задача — выбрать разумно. Отметим, что CancellationException
может возникнуть при использовании любого из методов. Ваш выбор обусловлен читаемостью, скоростью поддержки кода и особенностями приложения.
Выбор инструмента:
- Для чистого и неблокирующего кода предпочтительнее
join()
. - Когда важны надёжность и контроль,
get()
становится надёжным механизмом управления. - Вне зависимости от выбора, последовательность в коде ключева для упрощения отладки и поддержания порядка.
Полезные материалы
- [Completable