Рубрики
Без рубрики

Улучшения API Java 9 CompletableFuture

Краткое и практическое руководство по новым методам в API CompletableFuture.

Автор оригинала: baeldung.

1. введение

Java 9 поставляется с некоторыми изменениями в классе CompletableFuture . Такие изменения были внесены в рамках JEP 266 для рассмотрения распространенных жалоб и предложений с момента его внедрения в JDK 8, в частности, поддержка задержек и тайм-аутов, улучшенная поддержка подклассов и несколько полезных методов.

С точки зрения кода API поставляется с восемью новыми методами и пятью новыми статическими методами. Чтобы включить такие дополнения, было изменено примерно 1500 из 2400 строк кода (согласно OpenJDK).

2. Дополнения API экземпляра

Как уже упоминалось, API экземпляра поставляется с восемью новыми дополнениями, они:

  1. Исполнитель defaultExecutor()
  2. Завершенное будущее новое Незавершенное Будущее()
  3. Полная копия ()
  4. Стадия завершения минимальная Стадия завершения()
  5. CompletableFuture полная асинхронность(Поставщик расширяет T> поставщик, Исполнитель исполнитель) расширяет T> поставщик, Исполнитель исполнитель)
  6. CompletableFuture полная асинхронность(Поставщик расширяет T> поставщик) расширяет T> поставщик)
  7. Время ожидания завершения (длительное время ожидания, единица измерения времени)
  8. CompletableFuture completeOnTimeout(значение T, длительный тайм-аут, единица измерения времени)

2.1. Метод defaultExecutor()

Подпись : Исполнитель defaultExecutor()

Возвращает значение по умолчанию Исполнитель , используемое для асинхронных методов, в которых не указан Исполнитель .

new CompletableFuture().defaultExecutor()

Это может быть переопределено подклассами, возвращающими исполнителя, предоставляющего, по крайней мере, один независимый поток.

2.2. Метод нового Неполного Будущего()

Подпись : Завершенное будущее новое Незавершенное Будущее()

Новая неполная функция , также известная как “виртуальный конструктор”, используется для получения нового экземпляра completablefuture того же типа.

new CompletableFuture().newIncompleteFuture()

Этот метод особенно полезен при создании подклассов CompletableFuture , главным образом потому , что он используется внутренне почти во всех методах, возвращающих новый Этап завершения , позволяя подклассам контролировать, какой подтип возвращается такими методами.

2.3. Копирование метода()

Подпись : Полная копия ()

Этот метод возвращает новый CompletableFuture , который:

  • Когда это будет завершено нормально, новое также будет завершено нормально
  • Когда это выполняется исключительно с исключением X, новое также выполняется исключительно с исключением CompletionException с X в качестве причины
new CompletableFuture().copy()

Этот метод может быть полезен в качестве формы “защитного копирования”, чтобы предотвратить завершение клиентами, сохраняя при этом возможность организации зависимых действий для конкретного экземпляра CompletableFuture .

2.4. Метод минимального этапа Завершения()

Подпись : Стадия завершения минимальная стадия завершения()

Этот метод возвращает новый Этап завершения , который ведет себя точно так же, как описано методом копирования, однако такой новый экземпляр вызывает Исключение UnsupportedOperationException при каждой попытке получить или установить разрешенное значение.

new CompletableFuture().minimalCompletionStage()

Новый CompletableFuture со всеми доступными методами может быть получен с помощью метода toCompletableFuture , доступного в CompletionStage API.

2.5. Методы completeAsync()

Метод complete Async следует использовать для выполнения CompletableFuture асинхронно, используя значение, указанное Поставщиком предоставленным.

Подписи :

CompletableFuture completeAsync(Supplier supplier, Executor executor)
CompletableFuture completeAsync(Supplier supplier)

Разница между этими двумя перегруженными методами заключается в существовании второго аргумента, в котором может быть указан Исполнитель , выполняющий задачу. Если ничего не указано, будет использоваться исполнитель по умолчанию (возвращаемый методом defaultExecutor ).

2.6. Тайм-аут методов()

Подпись : Время ожидания завершения (длительное время ожидания, единица измерения времени)

new CompletableFuture().orTimeout(1, TimeUnit.SECONDS)

Разрешает CompletableFuture исключительно с помощью TimeoutException , если оно не завершено до указанного времени ожидания.

2.7. Время ожидания завершения метода()

Подпись : CompletableFuture completeOnTimeout(значение T, длительный тайм-аут, единица измерения времени)

new CompletableFuture().completeOnTimeout(value, 1, TimeUnit.SECONDS)

Завершает CompletableFuture обычно с указанным значением, если оно не завершено до указанного времени ожидания.

3. Статические дополнения API

Также были добавлены некоторые полезные методы. Они являются:

  1. Исполнитель delayedExecutor(длительная задержка, единица измерения времени, Исполнитель исполнитель)
  2. Исполнитель delayedExecutor(длительная задержка, единица измерения времени)
  3. Этап завершения Этап завершения(значение U)
  4. < Стадия завершения неудачная стадия(например, выбрасываемая)
  5. < Завершаемое будущее неудачное будущее(Выбрасываемое бывшее)

3.1. Методы, задерживаемые исполнителем

Подписи :

Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
Executor delayedExecutor(long delay, TimeUnit unit)

Возвращает новый Исполнитель , который отправляет задачу заданному базовому исполнителю после заданной задержки (или без задержки, если она не положительна). Каждая задержка начинается с вызова метода execute возвращенного исполнителя. Если исполнитель не указан, будет использоваться исполнитель по умолчанию ( ForkJoinPool.commonPool () ).

3.2. Методы завершенный этап и неудачный этап

Подписи :

 CompletionStage completedStage(U value)
 CompletionStage failedStage(Throwable ex)

Методы этой утилиты возвращают уже разрешенные CompletionStage экземпляры, либо завершенные нормально со значением ( completedStage ), либо завершенные исключительно ( failedStage ) с данным исключением.

3.3. Метод не удался в будущем

Подпись : Завершенное будущее неудачное будущее(Выбрасываемое бывшее)

Метод failed Future добавляет возможность указать уже завершенный экземпляр Completablefuture .

4. Примеры Использования

В этом разделе будет показано несколько примеров того, как использовать некоторые из новых API.

4.1. Задержка

В этом примере будет показано, как задержать завершение CompletableFuture с определенным значением на одну секунду. Это может быть достигнуто с помощью метода полная асинхронность вместе с delayedExecutor .

CompletableFuture future = new CompletableFuture<>();
future.completeAsync(() -> input, CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));

4.2. В Комплекте со Значением по Тайм-ауту

Другим способом достижения отложенного результата является использование метода completeOnTimeout . В этом примере определяется CompletableFuture , который будет разрешен с помощью данного ввода, если он останется нерешенным через 1 секунду.

CompletableFuture future = new CompletableFuture<>();
future.completeOnTimeout(input, 1, TimeUnit.SECONDS);

4.3. Время ожидания

Другая возможность-это тайм-аут, который решает будущее исключительно с помощью TimeoutException . Например, если время ожидания CompletableFuture истекло через 1 секунду, учитывая, что оно не было завершено до этого.

CompletableFuture future = new CompletableFuture<>();
future.orTimeout(1, TimeUnit.SECONDS);

5. Заключение

В заключение, Java 9 поставляется с несколькими дополнениями к CompletableFuture API, теперь он имеет лучшую поддержку подклассов, благодаря виртуальному конструктору newIncompleteFuture можно управлять экземплярами CompletionStage , возвращаемыми в большинстве CompletionStage API.

Он, безусловно, лучше поддерживает задержки и тайм-ауты, как показано ранее. Добавленные служебные методы следуют разумному шаблону, предоставляя CompletableFuture удобный способ указания разрешенных экземпляров.

Примеры, использованные в этой статье, можно найти в нашем репозитории GitHub .