Spec-Zone.ru › OpenJDK 27

Интерфейс StructuredTaskScope.Joiner<T, R, R_X extends Throwable>

Параметры типа:
T — тип результата подзадач, запущенных forkPREVIEW в области видимости
R — тип результата, возвращаемого методом join()PREVIEW
R_X — тип исключения, выбрасываемого методом join()PREVIEW
Внешний интерфейс:
StructuredTaskScopePREVIEW<T, R, R_X extends Throwable>
public static interface StructuredTaskScope.Joiner<T, R, R_X extends Throwable>
Joiner — это предварительная версия API платформы Java.
Программы могут использовать Joiner только при включённых предварительных функциях.
Предварительные функции могут быть удалены в одном из будущих выпусков или стать постоянными функциями платформы 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
См. также:
  • StructuredTaskScope.open(Joiner)PREVIEW

Краткое описание методов

Модификатор и тип Метод Описание
static <T> StructuredTaskScope.JoinerPREVIEW<T, List<T>, ExecutionException> allSuccessfulOrThrow()
Возвращает новый Joiner, формирующий список всех результатов после успешного завершения всех подзадач.
static <T, R_X extends Throwable>
StructuredTaskScope.JoinerPREVIEW<T,List<T>,R_X>
allSuccessfulOrThrow(Function<Throwable, R_X> esf)
Возвращает новый Joiner, формирующий список всех результатов после успешного завершения всех подзадач.
static <T> StructuredTaskScope.JoinerPREVIEW<T, List<StructuredTaskScope.SubtaskPREVIEW<T>>, RuntimeException> allUntil(Predicate<? super StructuredTaskScope.SubtaskPREVIEW<T>> isDone)
Возвращает новый Joiner, формирующий список всех подзадач после завершения всех подзадач или если проверка предиката для завершившейся подзадачи приводит к отмене области видимости.
static <T> StructuredTaskScope.JoinerPREVIEW<T, T, ExecutionException> anySuccessfulOrThrow()
Возвращает новый Joiner, формирующий результат любой успешно завершившейся подзадачи.
static <T, R_X extends Throwable>
StructuredTaskScope.JoinerPREVIEW<T,T,R_X>
anySuccessfulOrThrow(Function<Throwable, R_X> esf)
Возвращает новый Joiner, формирующий результат любой успешно завершившейся подзадачи.
static <T> StructuredTaskScope.JoinerPREVIEW<T, Void, ExecutionException> awaitAllSuccessfulOrThrow()
Возвращает новый Joiner, из-за которого метод join()PREVIEW ожидает успешного завершения всех подзадач.
static <T, R_X extends Throwable>
StructuredTaskScope.JoinerPREVIEW<T,Void,R_X>
awaitAllSuccessfulOrThrow(Function<Throwable, R_X> esf)
Возвращает новый Joiner, из-за которого метод join()PREVIEW ожидает успешного завершения всех подзадач.
default boolean onComplete(StructuredTaskScope.SubtaskPREVIEW<T> subtask)
Вызывается потоком, выполнившим подзадачу, после её успешного завершения или завершения с ошибкой из-за исключения.
default boolean onFork(StructuredTaskScope.SubtaskPREVIEW<T> subtask)
Вызывается методами fork(Callable)PREVIEW и fork(Runnable)PREVIEW при запуске подзадачи.
R result()
Вызывается методом join()PREVIEW для формирования результата (значения или исключения) после завершения всех подзадач или отмены области видимости.
R timeout()
Вызывается методом join()PREVIEW для формирования результата (значения или исключения), если область видимости открыта с тайм-аутом и время ожидания истекает до или во время ожидания в методе join().

Подробное описание методов

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, который формирует список всех результатов, если все подзадачи завершаются успешно. 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()

allSuccessfulOrThrow

static <T> StructuredTaskScope.JoinerPREVIEW<T, List<T>, ExecutionException> allSuccessfulOrThrow()
Возвращает новый Joiner, который формирует список всех результатов, если все подзадачи завершаются успешно. 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, который формирует результат любой успешно завершившейся подзадачи. 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()

anySuccessfulOrThrow

static <T> StructuredTaskScope.JoinerPREVIEW<T, T, ExecutionException> anySuccessfulOrThrow()
Возвращает новый Joiner, который формирует результат любой успешно завершившейся подзадачи. 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)
Возвращает новый Joiner, который заставляет метод 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()
Возвращает новый Joiner, который заставляет метод join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ ожидать успешного завершения всех подзадач. Joiner отменяет область и заставляет метод join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ выбросить ExecutionException, если какая-либо подзадача завершилась с ошибкой.

Метод join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ объекта StructuredTaskScopeПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ, открытого с этим Joiner, возвращает null, когда все подзадачи успешно завершены. Если какая-либо подзадача завершается с ошибкой, Joiner заставляет метод join() выбросить ExecutionException, указав в качестве причины исключение первой подзадачи, завершившейся с ошибкой.

Обработка тайм-аута: Joiner не может вернуть результат, если область отменена из-за тайм-аута. Если область была открыта с тайм-аутомПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ и срок тайм-аута истекает до начала или во время ожидания успешного завершения всех подзадач, Joiner заставляет метод join() выбросить ExecutionException, указав в качестве причины CancelledByTimeoutExceptionПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ.

Требования к реализации:
Joiner, возвращаемый этим методом, эквивалентен вызову awaitAllSuccessfulOrThrow(ExecutionException::new).
Параметры типа:
T — тип результата подзадач
Возвращает:
новый Joiner, который заставляет метод join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ ожидать успешного завершения всех подзадач
См. также:
  • StructuredTaskScope.open()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ
  • StructuredTaskScope.open(UnaryOperator)ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ

allUntil

static <T> StructuredTaskScope.JoinerPREVIEW<T, List<StructuredTaskScope.SubtaskPREVIEW<T>>, RuntimeException> allUntil(Predicate<? super StructuredTaskScope.SubtaskPREVIEW<T>> isDone)
Возвращает новый Joiner, который формирует список всех подзадач после завершения всех подзадач или если вычисление предиката для завершившейся подзадачи приводит к отмене области. 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, который формирует список всех подзадач после завершения всех подзадач или если вычисление предиката для завершившейся подзадачи приводит к отмене области

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2026, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API