Интерфейс StructuredTaskScope.Joiner<T, R>
- Параметры типа:
T— тип результата подзадач, выполняемых в области видимостиR— тип результата области видимости
- Включающий интерфейс:
StructuredTaskScopePREVIEW<T,R>
- Функциональный интерфейс:
- Это функциональный интерфейс, поэтому его можно использовать в качестве целевого типа для лямбда-выражения или ссылки на метод.
@FunctionalInterface public static interface StructuredTaskScope.Joiner<T,R>
Joiner — это предварительная версия API платформы Java. StructuredTaskScopePREVIEW для обработки завершения подзадач и получения результата для владельца области видимости, ожидающего завершения подзадач в методе joinPREVIEW. Joiner определяет статические методы для создания объектов Joiner для распространённых случаев:
-
allSuccessfulOrThrow()создаётJoiner, возвращающий поток завершённых подзадач для возврата методомjoinпосле успешного завершения всех подзадач. Он отменяет область видимости и приводит к выбрасыванию исключения методомjoin, если какая-либо подзадача завершается с ошибкой. -
anySuccessfulResultOrThrow()создаётJoiner, возвращающий результат первой успешно завершившейся подзадачи для возврата методомjoin. Если все подзадачи завершаются с ошибкой, методjoinвыбрасывает исключение. -
awaitAllSuccessfulOrThrow()создаётJoiner, который ожидает успешного завершения всех подзадач. Он отменяет область видимости и приводит к выбрасыванию исключения методомjoin, если какая-либо подзадача завершается с ошибкой. -
awaitAll()создаётJoiner, который ожидает завершения всех подзадач. Он не отменяет область видимости и не приводит к выбрасыванию исключения методомjoin.
Помимо методов для создания объектов Joiner в распространённых случаях, метод allUntil(Predicate) предназначен для создания Joiner, возвращающего поток всех подзадач. Он создаётся с помощью Predicate, определяющего, следует ли продолжить выполнение области видимости или отменить её. На основе этого Joiner можно создавать пользовательские политики, отменяющие область видимости при определённых условиях.
Более сложные политики можно реализовать, реализовав интерфейс Joiner. Метод onFork(Subtask) вызывается при создании подзадач. Метод onComplete(Subtask) вызывается, когда подзадачи завершаются с результатом или исключением. Эти методы возвращают boolean, указывающий, следует ли отменить область видимости. С помощью этих методов можно собирать подзадачи, результаты или исключения и управлять моментом отмены области видимости. Для получения результата (или исключения) для метода join необходимо реализовать метод result().
Если не указано иное, передача аргумента null методу этого класса приводит к выбрасыванию NullPointerException.
- Примечание к API:
- Для каждой
StructuredTaskScopeочень важно создавать новый объектJoiner. ОбъектыJoinerнельзя совместно использовать в разных областях видимости или повторно использовать после закрытия задачи.При разработке
Joinerследует учитывать код в месте использования, где обрабатываются результаты методаjoinPREVIEW. Должно быть ясно, что делаетJoiner, а что — код приложения в месте использования. В целом, реализацияJoiner— не место для «бизнес-логики».Joinerследует проектировать как можно более универсальным. - Требования к реализации:
- Реализации этого интерфейса должны быть потокобезопасными. Метод
onComplete(Subtask), определённый этим интерфейсом, может одновременно вызываться несколькими потоками. - С момента:
- 25
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static <T> StructuredTaskScope.JoinerPREVIEW |
allSuccessfulOrThrow() |
Возвращает новый объект Joiner, который возвращает поток всех подзадач после их успешного завершения. |
static <T> StructuredTaskScope.JoinerPREVIEW |
allUntil |
Возвращает новый объект Joiner, который возвращает поток всех подзадач после завершения всех подзадач или если предикат возвращает true для отмены области видимости. |
static <T> StructuredTaskScope.JoinerPREVIEW |
anySuccessfulResultOrThrow() |
Возвращает новый объект Joiner, который возвращает результат любой успешно завершившейся подзадачи. |
static <T> StructuredTaskScope.JoinerPREVIEW |
awaitAll() |
Возвращает новый объект Joiner, который ожидает завершения всех подзадач. |
static <T> StructuredTaskScope.JoinerPREVIEW |
awaitAllSuccessfulOrThrow() |
Возвращает новый объект Joiner, который ожидает успешного завершения подзадач. |
default boolean |
onComplete |
Вызывается потоком, запущенным для выполнения подзадачи, после её успешного завершения или завершения с исключением. |
default boolean |
onFork |
|
R |
result() |
Подробное описание методов
onFork
default boolean onFork(StructuredTaskScope.SubtaskPREVIEW<? extends T> subtask)
fork(Callable)PREVIEW и fork(Runnable)PREVIEW при создании подзадачи. Метод вызывается из потока-владельца задачи до создания потока для выполнения подзадачи.- Примечание к API:
- Этот метод вызывается методами
fork. Его не следует вызывать напрямую. - Требования к реализации:
- Реализация по умолчанию выбрасывает
NullPointerException, если подзадача имеет значениеnull. Если подзадача не находится в состоянииUNAVAILABLEPREVIEW, выбрасываетсяIllegalArgumentException; в противном случае возвращаетсяfalse. - Параметры:
-
subtask— подзадача - Возвращает:
-
trueдля отмены области видимости; в противном случаеfalse
onComplete
default boolean onComplete(StructuredTaskScope.SubtaskPREVIEW<? extends T> subtask)
- Примечание к API:
- Этот метод вызывается подзадачами при их завершении. Его не следует вызывать напрямую.
- Требования к реализации:
- Реализация по умолчанию выбрасывает
NullPointerException, если подзадача имеет значениеnull. Если подзадача не находится в состоянииSUCCESSPREVIEW илиFAILEDPREVIEW, выбрасываетсяIllegalArgumentException; в противном случае возвращаетсяfalse. - Параметры:
-
subtask— подзадача - Возвращает:
-
trueдля отмены области видимости; в противном случаеfalse
result
R result() throws Throwable
join()PREVIEW для получения результата (или исключения) после завершения всех подзадач или отмены области видимости. Результат этого метода возвращается методом join. Если этот метод выбрасывает исключение, join выбрасывает StructuredTaskScope.FailedExceptionPREVIEW, причиной которого является исключение, выброшенное этим методом. При обычном использовании метод join вызывает этот метод не более одного раза для получения результата (или исключения). Поведение этого метода при прямом вызове и при вызове более одного раза не определено. По возможности реализация должна возвращать равный результат (или выбрасывать то же исключение) при повторных вызовах для получения результата.
- Примечание к API:
- Этот метод вызывается методом
join. Его не следует вызывать напрямую. - Возвращает:
- результат
- Выбрасывает:
-
Throwable— исключение
allSuccessfulOrThrow
static <T> StructuredTaskScope.JoinerPREVIEW<T, Stream<StructuredTaskScope.SubtaskPREVIEW<T>>> allSuccessfulOrThrow()
Joiner отменяет область видимости и приводит к выбрасыванию исключения методом join, если какая-либо подзадача завершается с ошибкой. Если все подзадачи завершаются успешно, метод result() объекта joiner возвращает поток всех подзадач в порядке их создания. Если какая-либо подзадача завершилась с ошибкой, метод result выбрасывает исключение первой подзадачи, завершившейся с ошибкой.
- Примечание к API:
- Объекты joiner, возвращаемые этим методом, подходят для случаев, когда все подзадачи возвращают результат одного типа. Объекты joiner, возвращаемые методом
awaitAllSuccessfulOrThrow(), подходят для случаев, когда подзадачи возвращают результаты разных типов. - Параметры типа:
T— тип результата подзадач- Возвращает:
- новый объект Joiner, который возвращает поток всех подзадач после их успешного завершения
anySuccessfulResultOrThrow
static <T> StructuredTaskScope.JoinerPREVIEW<T,T> anySuccessfulResultOrThrow()
Joiner приводит к выбрасыванию исключения методом join, если все подзадачи завершаются с ошибкой. Метод result() объекта joiner возвращает результат успешно завершившейся подзадачи. Если все подзадачи завершаются с ошибкой, метод result выбрасывает исключение одной из завершившихся с ошибкой подзадач. Метод result выбрасывает NoSuchElementException, если подзадачи не создавались.
- Параметры типа:
T— тип результата подзадач- Возвращает:
- новый объект Joiner, который возвращает результат любой успешно завершившейся подзадачи
awaitAllSuccessfulOrThrow
static <T> StructuredTaskScope.JoinerPREVIEW<T,Void> awaitAllSuccessfulOrThrow()
Joiner отменяет область видимости и приводит к выбрасыванию исключения методом join, если какая-либо подзадача завершается с ошибкой. Метод result объекта joiner возвращает null, если все подзадачи завершаются успешно, или выбрасывает исключение первой подзадачи, завершившейся с ошибкой.
- Примечание к API:
- Объекты joiner, возвращаемые этим методом, подходят для случаев, когда подзадачи возвращают результаты разных типов. Объекты joiner, возвращаемые методом
allSuccessfulOrThrow(), подходят для случаев, когда подзадачи возвращают результат одного типа. - Параметры типа:
T— тип результата подзадач- Возвращает:
- новый объект Joiner, который ожидает успешного завершения подзадач
awaitAll
static <T> StructuredTaskScope.JoinerPREVIEW<T,Void> awaitAll()
Joiner не отменяет область видимости, если подзадача завершается с ошибкой. Метод result объекта joiner возвращает null.
- Примечание к API:
- Этот Joiner полезен в случаях, когда подзадачи используют побочные эффекты, а не возвращают результаты или завершаются с исключениями. Метод
fork(Runnable)PREVIEW можно использовать для создания подзадач, не возвращающих результат.Этот Joiner также можно использовать в сценариях fan-in, когда подзадачи создаются для обработки входящих соединений и их количество не ограничено. В этом примере поток, выполняющий метод
acceptLoop, остановится только при прерывании или асинхронном закрытии сокета прослушивания.void acceptLoop(ServerSocket listener) throws IOException, InterruptedException { try (var scope = StructuredTaskScope.open(Joiner.<Socket>awaitAll())) { while (true) { Socket socket = listener.accept(); scope.fork(() -> handle(socket)); } } } - Параметры типа:
T— тип результата подзадач- Возвращает:
- новый объект Joiner, который ожидает завершения всех подзадач
allUntil
static <T> StructuredTaskScope.JoinerPREVIEW<T, Stream<StructuredTaskScope.SubtaskPREVIEW<T>>> allUntil(Predicate<StructuredTaskScope.SubtaskPREVIEW<? extends T>> isDone)
true для отмены области видимости. Метод onComplete(Subtask) объекта joiner вызывает метод test предиката, передавая ему подзадачу, которая успешно завершилась или завершилась с исключением. Если метод test возвращает true, область видимости отменяется. Метод test должен быть потокобезопасным, поскольку он может одновременно вызываться несколькими потоками. Если выполнение метода test завершается с исключением или ошибкой, поток, выполнивший подзадачу, вызывает обработчик неперехваченных исключений с этим исключением или ошибкой перед завершением потока.
Метод result() объекта joiner возвращает поток всех подзадач в порядке их создания. Поток может содержать завершившиеся подзадачи (в состоянии SUCCESSPREVIEW или FAILEDPREVIEW) или подзадачи в состоянии UNAVAILABLEPREVIEW, если область видимости была отменена до создания или завершения всех подзадач.
В следующем примере этот метод используется для создания Joiner, который отменяет область видимости, если две или более подзадачи завершаются с ошибкой.
class CancelAfterTwoFailures<T> implements Predicate<Subtask<? extends T>> {
private final AtomicInteger failedCount = new AtomicInteger();
@Override
public boolean test(Subtask<? extends T> subtask) {
return subtask.state() == Subtask.State.FAILED
&& failedCount.incrementAndGet() >= 2;
}
}
var joiner = Joiner.all(new CancelAfterTwoFailures<String>());
В следующем примере allUntil используется для ожидания завершения всех подзадач без отмены. Это аналогично awaitAll(), но возвращается поток завершённых подзадач.
<T> List<Subtask<T>> invokeAll(Collection<Callable<T>> tasks) throws InterruptedException {
try (var scope = StructuredTaskScope.open(Joiner.<T>allUntil(_ -> false))) {
tasks.forEach(scope::fork);
return scope.join().toList();
}
}
- Параметры типа:
T— тип результата подзадач- Параметры:
-
isDone— предикат для проверки завершённых подзадач - Возвращает:
- новый объект Joiner, который возвращает поток всех подзадач после их завершения или если предикат возвращает
trueдля отмены области видимости
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/StructuredTaskScope.Joiner.html
Joinerтолько при включённых функциях предварительной версии.