Интерфейс StructuredTaskScope.Joiner<T, R, R_X extends Throwable>
- Параметры типа:
T— тип результата подзадач, запущенных forkPREVIEW в области видимостиR— тип результата, возвращаемого методомjoin()PREVIEWR_X— тип исключения, выбрасываемого методомjoin()PREVIEW
- Внешний интерфейс:
StructuredTaskScopePREVIEW<T, R, R_X extends Throwable>
public static interface StructuredTaskScope.Joiner<T, R, R_X extends Throwable>
Joiner — это предварительная версия API платформы Java. StructuredTaskScopePREVIEW для получения результата метода join()PREVIEW области видимости. Область StructuredTaskScope открывается с помощью Joiner, который обрабатывает подзадачи по мере их запуска с помощью forkPREVIEW в области видимости, а также после завершения их выполнения. Joiner обрабатывает подзадачи, которые завершаются успешно с результатом типа T, или завершаются сбоем с любым исключением или ошибкой. Joiner реализует политику, которая может отменить область видимости при наступлении определённого условия (например, при сбое подзадачи). Когда все подзадачи завершат выполнение или область видимости будет отменена, Joiner формирует результат для метода join()PREVIEW. Результатом является значение типа R или исключение типа R_X.
Joiner определяет статические методы для создания объектов Joiner в распространённых случаях:
-
allSuccessfulOrThrow()иallSuccessfulOrThrow(Function)создаютJoiner, который формирует список всех результатов, возвращаемыйjoin()после успешного завершения всех подзадач.Joinerотменяет область видимости и приводит к тому, чтоjoin()выбрасываетExecutionExceptionили исключение, возвращённое функцией, предоставляющей исключение, если какая-либо подзадача завершается сбоем. -
anySuccessfulOrThrow()иanySuccessfulOrThrow(Function)создаютJoiner, который формирует результат любой успешно завершившейся подзадачи для возврата методомjoin().Joinerприводит к тому, чтоjoin()выбрасываетExecutionExceptionили исключение, возвращённое функцией, предоставляющей исключение, если все подзадачи завершаются сбоем. -
awaitAllSuccessfulOrThrow()иawaitAllSuccessfulOrThrow(Function)создаютJoiner, который ожидает успешного завершения всех подзадач.Joinerне формирует результат, отличный отnull, для возврата методомjoin().Joinerотменяет область видимости и приводит к тому, чтоjoin()выбрасываетExecutionExceptionили исключение, возвращённое функцией, предоставляющей исключение, если какая-либо подзадача завершается сбоем.
Помимо методов создания объектов Joiner для распространённых случаев, метод allUntil(Predicate) можно использовать для создания Joiner, реализующего политику отмены. Joiner создаётся с помощью предиката, который проверяется для завершившихся подзадач. Joiner отменяет область видимости, если предикат возвращает true. При использовании этого Joiner результатом метода join() является список всех подзадач, запущенных в области видимости.
Более сложные политики можно реализовать, создав класс, реализующий интерфейс Joiner. Метод onFork(Subtask) вызывается при запуске подзадач. Метод onComplete(Subtask) вызывается при завершении подзадач с результатом или исключением. Эти методы возвращают boolean, указывающий, следует ли отменить область видимости. С помощью этих методов можно собирать подзадачи, результаты или исключения и определять, когда следует отменить область видимости. Метод result() необходимо реализовать для формирования результата (значения или исключения) метода
join(). Метод timeout() необходимо реализовать для формирования результата в случае тайм-аутаPREVIEW.
Если не указано иное, передача аргумента null методу этого класса приведёт к выбрасыванию NullPointerException.
- Примечание по API:
- Очень важно создавать новый объект
Joinerдля каждойStructuredTaskScope. ОбъектыJoinerнельзя использовать совместно с разными областями видимости или повторно использовать после закрытия области видимости. - Требования к реализации:
- Реализации этого интерфейса должны быть потокобезопасными. Метод
onComplete(Subtask)может вызываться одновременно для нескольких подзадач, завершающихся в одно и то же время. Кроме того, методonComplete(Subtask)может вызываться одновременно с вызовом потоковладельцем области видимости методовonFork(Subtask),result()илиtimeout().В документации к
Joinerследует чётко описать обработку тайм-аутовPREVIEW. Во многих случаях тайм-аут приводит к тому, что методjoin()выбрасывает исключение, причиной которого являетсяCancelledByTimeoutExceptionPREVIEW. Некоторые реализацииJoinerмогут возвращать результат в случае тайм-аута.При разработке
Joinerследует учитывать код в месте использования, обрабатывающий результаты методаjoin()PREVIEW. Должно быть чётко понятно, за что отвечаетJoiner, а за что — код приложения в месте использования. В общем случае реализацияJoinerне предназначена для «бизнес-логики».Joinerследует проектировать как можно более универсальным. - Начиная с:
- 25
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static <T> StructuredTaskScope.JoinerPREVIEW |
allSuccessfulOrThrow() |
Возвращает новый Joiner, формирующий список всех результатов после успешного завершения всех подзадач. |
static <T, R_X extends Throwable> |
allSuccessfulOrThrow |
Возвращает новый Joiner, формирующий список всех результатов после успешного завершения всех подзадач. |
static <T> StructuredTaskScope.JoinerPREVIEW |
allUntil |
|
static <T> StructuredTaskScope.JoinerPREVIEW |
anySuccessfulOrThrow() |
Возвращает новый Joiner, формирующий результат любой успешно завершившейся подзадачи. |
static <T, R_X extends Throwable> |
anySuccessfulOrThrow |
Возвращает новый Joiner, формирующий результат любой успешно завершившейся подзадачи. |
static <T> StructuredTaskScope.JoinerPREVIEW |
awaitAllSuccessfulOrThrow() |
|
static <T, R_X extends Throwable> |
awaitAllSuccessfulOrThrow |
|
default boolean |
onComplete |
Вызывается потоком, выполнившим подзадачу, после её успешного завершения или завершения с ошибкой из-за исключения. |
default boolean |
onFork |
|
R |
result() |
|
R |
timeout() |
Подробное описание методов
onFork
default boolean onFork(StructuredTaskScope.SubtaskPREVIEW<T> subtask)
fork(Callable)PREVIEW и fork(Runnable)PREVIEW при запуске подзадачи. Метод вызывается до создания потока для выполнения подзадачи.- Примечание API:
- Этот метод вызывается методами
fork. Его не следует вызывать напрямую. - Требования к реализации:
- Реализация по умолчанию выбрасывает
NullPointerException, если подзадача —null. Она выбрасываетIllegalArgumentException, если подзадача не находится в состоянииUNAVAILABLEPREVIEW, в противном случае она возвращаетfalse. - Параметры:
-
subtask— подзадача - Возвращает:
-
trueдля отмены области видимости, в противном случае —false
onComplete
default boolean onComplete(StructuredTaskScope.SubtaskPREVIEW<T> subtask)
- Примечание API:
- Этот метод вызывается подзадачами при их завершении. Его не следует вызывать напрямую.
- Требования к реализации:
- Реализация по умолчанию выбрасывает
NullPointerException, если подзадача —null. Она выбрасываетIllegalArgumentException, если подзадача не находится в состоянииSUCCESSPREVIEW илиFAILEDPREVIEW, в противном случае она возвращаетfalse. - Параметры:
-
subtask— подзадача - Возвращает:
-
trueдля отмены области видимости, в противном случае —false
result
R result() throws R_X
join()PREVIEW для получения результата (значения или исключения) после ожидания завершения всех подзадач или отмены области видимости. Этот метод не вызывается, если область видимости была открыта с тайм-аутом и срок ожидания истекает до начала ожидания или во время него. Этот метод будет вызван не более одного раза методом join() для получения результата. Поведение этого метода при прямом вызове не определено.
- Примечание API:
- Этот метод вызывается методом
join(). Его не следует вызывать напрямую. - Возвращает:
- результат
- Выбрасывает:
-
R_X— если результатом является исключение
timeout
R timeout() throws R_X
join()PREVIEW для получения результата (значения или исключения), когда область видимости была открыта с тайм-аутом и срок ожидания истекает до начала ожидания или во время ожидания в методе join(). Если результатом является исключение, этот метод выбрасывает исключение с CancelledByTimeoutExceptionPREVIEW в качестве cause.
Этот метод будет вызван не более одного раза методом join() для получения результата. Поведение этого метода при прямом вызове не определено.
- Примечание API:
- Этот метод вызывается методом
join(). Его не следует вызывать напрямую. - Возвращает:
- результат
- Выбрасывает:
-
R_X— с причинойCancelledByTimeoutException, если результатом является исключение - Начиная с:
- 27
allSuccessfulOrThrow
static <T, R_X extends Throwable> StructuredTaskScope.JoinerPREVIEW<T,List<T>,R_X> allSuccessfulOrThrow(Function<Throwable, R_X> esf)
Joiner отменяет область видимости и вызывает исключение в методе join()PREVIEW, если какая-либо подзадача завершается с ошибкой. Метод join()PREVIEW у StructuredTaskScopePREVIEW, открытой с этим Joiner, возвращает список результатов в том порядке, в котором подзадачи были запущеныPREVIEW, если все подзадачи завершаются успешно. Если подзадачи не запускались, возвращается пустой список. Если какая-либо подзадача завершается с ошибкой, Joiner вызывает исключение в методе join(). Это исключение возвращается заданной функцией, предоставляющей исключение, применённой к исключению первой завершившейся с ошибкой подзадачи. Функция должна вернуть исключение, в котором исключение неудачно завершившейся подзадачи (аргумент функции) указано в качестве причины. Если функция возвращает null, это вызывает выбрасывание NullPointerException методом join().
Обработка тайм-аута: Joiner не может сформировать результат, если область видимости отменена из-за тайм-аута. Если область видимости была открыта с тайм-аутомPREVIEW, и срок ожидания истекает до начала ожидания или во время ожидания успешного завершения всех подзадач, Joiner вызывает исключение в методе join(). Исключение возвращается функцией, предоставляющей исключение, применённой к CancelledByTimeoutExceptionPREVIEW.
- Примечание API:
- Joiner, возвращаемые этим методом, подходят для случаев, когда все подзадачи возвращают результат одного типа. Они избавляют от необходимости вести учёт и хранить ссылку на объекты
SubtaskPREVIEW, возвращаемые методомfork(Callable)PREVIEW. Joiner, возвращаемые методамиawaitAllSuccessfulOrThrow(Function)иawaitAllSuccessfulOrThrow(), подходят для случаев, когда подзадачи возвращают результаты разных типов и необходимо хранить ссылку на объектыSubtask.В следующем примере показан метод, который открывает
StructuredTaskScopeс Joiner, созданным с помощьюallSuccessfulOrThrow(Function). Метод вызывается с коллекцией объектов Callable. Он запускаетPREVIEW подзадачу для выполнения каждого объекта Callable, ожидает завершения всех подзадач без ошибок вjoin()PREVIEW, а затем возвращает список результатов. Если какая-либо подзадача завершается с ошибкой, метод выбрасывает исключение времени выполненияCompletionException, причиной которого является исключение первой завершившейся с ошибкой подзадачи.<T> List<T> invokeAll(Collection<Callable<T>> tasks) throws InterruptedException { try (var scope = StructuredTaskScope.open( Joiner.<T, CompletionException>allSuccessfulOrThrow(CompletionException::new))) { tasks.forEach(scope::fork); List<T> results = scope.join(); return results; } } - Параметры типа:
T— тип результата подзадачR_X— тип исключения, выбрасываемого методомjoin()PREVIEW- Параметры:
-
esf— функция, предоставляющая исключение - Возвращает:
- новый Joiner, формирующий список всех результатов, если все подзадачи завершаются успешно
- Начиная с:
- 27
- См. также:
allSuccessfulOrThrow
static <T> StructuredTaskScope.JoinerPREVIEW<T, List<T>, ExecutionException> allSuccessfulOrThrow()
Joiner отменяет область видимости и вызывает выбрасывание ExecutionException методом join()PREVIEW, если какая-либо подзадача завершается с ошибкой. Метод join()PREVIEW у StructuredTaskScopePREVIEW, открытой с этим Joiner, возвращает список результатов в том порядке, в котором подзадачи были запущеныPREVIEW, если все подзадачи завершаются успешно. Если подзадачи не запускались, возвращается пустой список. Если какая-либо подзадача завершается с ошибкой, Joiner вызывает выбрасывание ExecutionException методом join(), указав в качестве причины исключение первой завершившейся с ошибкой подзадачи.
Обработка тайм-аута: Joiner не может сформировать результат, если область видимости отменена из-за тайм-аута. Если область видимости была открыта с тайм-аутомPREVIEW, и срок ожидания истекает до начала ожидания или во время ожидания успешного завершения всех подзадач, Joiner вызывает выбрасывание ExecutionException методом join(), указав CancelledByTimeoutExceptionPREVIEW в качестве причины.
- Требования к реализации:
- Joiner, возвращаемый этим методом, эквивалентен вызову
allSuccessfulOrThrow(ExecutionException::new). - Параметры типа:
T— тип результата подзадач- Возвращает:
- новый Joiner, формирующий список всех результатов, если все подзадачи завершаются успешно
anySuccessfulOrThrow
static <T, R_X extends Throwable> StructuredTaskScope.JoinerPREVIEW<T,T,R_X> anySuccessfulOrThrow(Function<Throwable, R_X> esf)
Joiner отменяет область видимости при успешном завершении подзадачи. Если все подзадачи завершаются с ошибкой, он вызывает исключение в методе join()PREVIEW. Метод join()PREVIEW у StructuredTaskScopePREVIEW, открытой с этим Joiner, возвращает результат успешно завершившейся подзадачи. Если подзадача завершается успешно, область видимости отменяется, а метод join() возвращает её результат. Если все подзадачи завершаются с ошибкой, Joiner вызывает исключение в методе join(). Это исключение возвращается заданной функцией, предоставляющей исключение, применённой к исключению одной из завершившихся с ошибкой подзадач. Функция должна вернуть исключение, в котором исключение неудачно завершившейся подзадачи (аргумент функции) указано в качестве причины. Если функция возвращает null, это вызывает выбрасывание NullPointerException методом join(). Если подзадачи не запускались, Joiner вызывает выбрасывание методом join() исключения, возвращённого функцией при её применении к экземпляру NoSuchElementException.
Обработка тайм-аута: Joiner не может сформировать результат, если область видимости отменена из-за тайм-аута. Если область видимости была открыта с тайм-аутомPREVIEW, и срок ожидания истекает до начала ожидания или во время ожидания успешного завершения подзадачи, Joiner вызывает исключение в методе join(). Исключение возвращается функцией, предоставляющей исключение, применённой к CancelledByTimeoutExceptionPREVIEW.
- Примечание API:
- В следующем примере показан метод, который открывает
StructuredTaskScopeс Joiner, созданным с помощьюanySuccessfulOrThrow(Function). Метод вызывается с коллекцией объектов Callable. Он запускаетPREVIEW подзадачу для выполнения каждого объекта Callable и ожидает вjoin()PREVIEW успешного завершения любой подзадачи, возвращая её результат. Если все подзадачи завершаются с ошибкой, метод выбрасывает исключение времени выполненияCompletionException, причиной которого является исключение завершившейся с ошибкой подзадачи.<T> T invokeAny(Collection<Callable<T>> tasks) throws InterruptedException { try (var scope = StructuredTaskScope.open( Joiner.<T, CompletionException>anySuccessfulOrThrow(CompletionException::new))) { tasks.forEach(scope::fork); T result = scope.join(); return result; } } - Параметры типа:
T— тип результата подзадачR_X— тип исключения, выбрасываемого методомjoin()PREVIEW- Параметры:
-
esf— функция, предоставляющая исключение - Возвращает:
- новый Joiner, формирующий результат любой успешно завершившейся подзадачи
- Начиная с:
- 27
- См. также:
anySuccessfulOrThrow
static <T> StructuredTaskScope.JoinerPREVIEW<T, T, ExecutionException> anySuccessfulOrThrow()
Joiner отменяет область видимости при успешном завершении подзадачи. Если все подзадачи завершаются с ошибкой, он вызывает выбрасывание ExecutionException методом join()PREVIEW. Метод join()PREVIEW у StructuredTaskScopePREVIEW, открытой с этим Joiner, возвращает результат успешно завершившейся подзадачи. Если подзадача завершается успешно, область видимости отменяется, а метод join() возвращает её результат. Если все подзадачи завершаются с ошибкой, Joiner вызывает выбрасывание ExecutionException методом
join(), указав в качестве причины исключение одной из завершившихся с ошибкой подзадач. Если подзадачи не запускались, Joiner вызывает выбрасывание ExecutionException методом join(), указав NoSuchElementException в качестве причины.
Обработка тайм-аута: Joiner не может сформировать результат, если область видимости отменена из-за тайм-аута. Если область видимости была открыта с тайм-аутомPREVIEW, и срок ожидания истекает до начала ожидания или во время ожидания успешного завершения подзадачи, Joiner вызывает выбрасывание ExecutionException методом join(), указав CancelledByTimeoutExceptionPREVIEW в качестве причины.
- Требования к реализации:
- Joiner, возвращаемый этим методом, эквивалентен вызову
anySuccessfulOrThrow(ExecutionException::new). - Параметры типа:
T— тип результата подзадач- Возвращает:
- новый Joiner, формирующий результат любой успешно завершившейся подзадачи
- Начиная с:
- 26
awaitAllSuccessfulOrThrow
static <T, R_X extends Throwable> StructuredTaskScope.JoinerPREVIEW<T,Void,R_X> awaitAllSuccessfulOrThrow(Function<Throwable, R_X> esf)
join()PREVIEW ожидать успешного завершения всех подзадач. Joiner отменяет область видимости и вызывает исключение в методе join()PREVIEW, если какая-либо подзадача завершается с ошибкой. Метод join()PREVIEW у StructuredTaskScopePREVIEW, открытой с этим Joiner, возвращает null, если все подзадачи завершаются успешно. Если какая-либо подзадача завершается с ошибкой, Joiner вызывает исключение в методе join(). Это исключение возвращается заданной функцией, предоставляющей исключение, применённой к исключению первой завершившейся с ошибкой подзадачи. Функция должна вернуть исключение, в котором исключение неудачно завершившейся подзадачи (аргумент функции) указано в качестве причины. Если функция возвращает null, это вызывает выбрасывание NullPointerException методом join().
Обработка тайм-аута: Joiner не может сформировать результат, если область видимости отменена из-за тайм-аута. Если область видимости была открыта с тайм-аутомPREVIEW, и срок ожидания истекает до начала ожидания или во время ожидания успешного завершения всех подзадач, Joiner вызывает исключение в методе join(). Исключение возвращается функцией, предоставляющей исключение, применённой к CancelledByTimeoutExceptionPREVIEW.
- Примечание API:
- Joiner, возвращаемые этим методом, подходят для случаев, когда подзадачи возвращают результаты разных типов и необходимо хранить ссылку на каждый объект
SubtaskPREVIEW. Joiner, возвращаемые методамиallSuccessfulOrThrow(Function)иallSuccessfulOrThrow(), подходят для случаев, когда подзадачи возвращают результат одного типа.В следующем примере открывается
StructuredTaskScopeс Joiner, созданным с помощьюawaitAllSuccessfulOrThrow(). Запускаются две подзадачи с помощью вызова forkPREVIEW, после чего выполняется ожидание вjoin()PREVIEW успешного завершения обеих подзадач или сбоя любой из них. Если обе подзадачи завершаются успешно, для получения их результатов вызываетсяSubtask.get()PREVIEW для каждой подзадачи. Если какая-либо подзадача завершается с ошибкой, выбрасывается исключение времени выполненияCompletionException, причиной которого является исключение завершившейся с ошибкой подзадачи.try (var scope = StructuredTaskScope.open( Joiner.awaitAllSuccessfulOrThrow(CompletionException::new))) { Subtask<String> subtask1 = scope.fork(callable1); Subtask<Integer> subtask2 = scope.fork(callable2); // throws CompletionException if either subtask fails scope.join(); // both subtasks completed successfully var result = new MyResult(subtask1.get(), subtask2.get()); } - Параметры типа:
T— тип результата подзадачR_X— тип исключения, выбрасываемого методомjoin()PREVIEW- Параметры:
-
esf— функция, предоставляющая исключение - Возвращает:
- новый Joiner, который заставляет метод
join()PREVIEW ожидать успешного завершения всех подзадач - Начиная с:
- 27
awaitAllSuccessfulOrThrow
static <T> StructuredTaskScope.JoinerPREVIEW<T, Void, ExecutionException> awaitAllSuccessfulOrThrow()
join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ ожидать успешного завершения всех подзадач. Joiner отменяет область и заставляет метод join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ выбросить ExecutionException, если какая-либо подзадача завершилась с ошибкой. Метод join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ объекта StructuredTaskScopeПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ, открытого с этим Joiner, возвращает null, когда все подзадачи успешно завершены. Если какая-либо подзадача завершается с ошибкой, Joiner заставляет метод join() выбросить ExecutionException, указав в качестве причины исключение первой подзадачи, завершившейся с ошибкой.
Обработка тайм-аута: Joiner не может вернуть результат, если область отменена из-за тайм-аута. Если область была открыта с тайм-аутомПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ и срок тайм-аута истекает до начала или во время ожидания успешного завершения всех подзадач, Joiner заставляет метод join() выбросить ExecutionException, указав в качестве причины CancelledByTimeoutExceptionПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ.
- Требования к реализации:
- Joiner, возвращаемый этим методом, эквивалентен вызову
awaitAllSuccessfulOrThrow(ExecutionException::new). - Параметры типа:
T— тип результата подзадач- Возвращает:
- новый Joiner, который заставляет метод
join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ ожидать успешного завершения всех подзадач - См. также:
allUntil
static <T> StructuredTaskScope.JoinerPREVIEW<T, List<StructuredTaskScope.SubtaskPREVIEW<T>>, RuntimeException> allUntil(Predicate<? super StructuredTaskScope.SubtaskPREVIEW<T>> isDone)
Joiner не приводит к тому, что метод join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ выбрасывает исключение, если подзадачи завершились с ошибкой или истёк заданный тайм-аутПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ. Этот метод можно использовать для создания Joiner, реализующего политику отмены. Метод join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ объекта StructuredTaskScopeПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ, открытого с этим Joiner, возвращает список всех подзадач в порядке их запускаПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ, когда все подзадачи завершены или область отменена. Возвращаемый список может содержать завершившиеся подзадачи (в состоянии SUCCESSПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ или FAILEDПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ), а также подзадачи в состоянии UNAVAILABLEПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ, если они были запущены или завершились после отмены области. Область отменяется, если заданный предикат вычисляется в true либо заданный тайм-аут истекает до вызова метода join() или во время его выполнения.
Метод test(Object) заданного Predicate вызывается для завершившейся подзадачи потоком, который выполнил эту подзадачу. Метод вызывается после завершения подзадачи (успешного или с исключением), но до завершения потока. Область отменяется, если метод
test возвращает true. Метод test должен быть потокобезопасным. Он может вызываться одновременно из нескольких потоков, поскольку несколько подзадач могут завершиться в одно и то же время. Если метод выбрасывает исключение или ошибку, поток вызывает обработчик неперехваченных исключений с этим исключением или ошибкой до завершения потока.
Обработка тайм-аута: Если использовать этот метод с областью, для которой задан тайм-аутПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ, и срок тайм-аута истечёт до завершения всех подзадач, метод join() вернёт список всех подзадач. Исключение не выбрасывается. Подзадачи, не завершившиеся до истечения тайм-аута, будут находиться в состоянии UNAVAILABLE.
- Примечание к API:
- В следующем примере используется
allUntilдля создания Joiner, который отменяет область, если две или более подзадачи завершаются с ошибкой.class CancelAfterTwoFailures implements Predicate<Subtask<?>> { private final AtomicInteger failedCount = new AtomicInteger(); @Override public boolean test(Subtask<?> subtask) { return subtask.state() == Subtask.State.FAILED && failedCount.incrementAndGet() >= 2; } } var joiner = Joiner.<String>allUntil(new CancelAfterTwoFailures());В следующем примере используется
allUntilдля создания Joiner, который отменяет область, если какая-либо подзадача завершается успешно. Подзадачи группируются по их состоянию, чтобы создать карту с не более чем тремя парами «ключ-значение». Ключом карты является состояние подзадачи, а значением — список подзадач в этом состоянии.Predicate<Subtask<?>> isSuccessful = s -> s.state() == Subtask.State.SUCCESS; try (var scope = StructuredTaskScope.open(Joiner.<String>allUntil(isSuccessful))) { tasks.forEach(scope::fork); Map<Subtask.State, List<Subtask<String>>> subtasksByState = scope.join() .stream() .collect(Collectors.groupingBy(Subtask::state)); }В следующем примере показан метод, использующий
allUntilдля создания Joiner, который не отменяет область. Метод ожидает завершения всех подзадач или истечения тайм-аута. Он возвращает список всех подзадач в том же порядке, что и коллекция вызываемых объектов, даже если тайм-аут истекает до вызоваjoin()или во время его выполнения.<T> List<Subtask<T>> invokeAll(Collection<Callable<T>> tasks, Duration timeout) throws InterruptedException { try (var scope = StructuredTaskScope.open(Joiner.<T>allUntil(_ -> false), cf -> cf.withTimeout(timeout))) { tasks.forEach(scope::fork); return scope.join(); } } - Параметры типа:
T— тип результата подзадач- Параметры:
-
isDone— предикат для вычисления по завершившимся подзадачам - Возвращает:
- новый Joiner, который формирует список всех подзадач после завершения всех подзадач или если вычисление предиката для завершившейся подзадачи приводит к отмене области
© 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.
Joinerтолько при включённых предварительных функциях.