get() и join() в CompletableFuture в Java: разница и влияние

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для эффективности и избежания обработки проверяемых исключений используйте CompletableFuture.join(). Этот метод порождает непроверяемые исключения CompletionException, и идеален для сохранения лаконичности лямбда-выражений и потоков.

CompletableFuture.get() используйте в ситуациях, где нужен контроль над исключениями, так как этот метод генерирует проверяемые исключения ExecutionException и InterruptedException, обработка которых должна быть явно указана.

Java
Скопировать код
String resultJoin = CompletableFuture.supplyAsync(() -> {/* 👀 Без рук, мама! */ return "Result";}).join(); // Непроверяемые исключения

String resultGet; // Проверяемые исключения
try {
  resultGet = CompletableFuture.supplyAsync(() -> {/* 🎓 Логика учёного */ return "Result";}).get();
} catch (ExecutionException | InterruptedException e) {
  throw new RuntimeException(e); // 🎾 И вот мы здесь!
}
Кинга Идем в IT: пошаговый план для смены профессии

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> как две дороги к одной и той же цели:

Markdown
Скопировать код
Комната с сокровищами (🏆): Результат выполнения CompletableFuture

Маршрут join() (🚪🤝):

Markdown
Скопировать код
- Если по пути встретите замок (Исключение), он автоматически откроется (бросает непроверяемое исключение).
- Проход прост и прям, не требует дополнительных забот о предупреждении о препятствиях (непроверяемые исключения не требуют объявления).

Тропа get() (🚪🔑):

Markdown
Скопировать код
- Нужно иметь ключ (обработка исключений) для входа, иначе останетесь снаружи (генерирует проверяемые исключения).
- Требует уведомления о возможных сложностях (проверяемые исключения должны быть объявлены или обработаны).

Оба пути ведут к цели, но каждый требует своей стратегии.

join() или get() – Кого назначить победителем?

Ни один из методов не обладает преимуществом в производительности, поэтому ваша задача — выбрать разумно. Отметим, что CancellationException может возникнуть при использовании любого из методов. Ваш выбор обусловлен читаемостью, скоростью поддержки кода и особенностями приложения.

Выбор инструмента:

  • Для чистого и неблокирующего кода предпочтительнее join().
  • Когда важны надёжность и контроль, get() становится надёжным механизмом управления.
  • Вне зависимости от выбора, последовательность в коде ключева для упрощения отладки и поддержания порядка.

Полезные материалы

  1. [Completable