Spec-Zone.ru › OpenJDK 25

Класс ForkJoinTask<V>

java.lang.Object
java.util.concurrent.ForkJoinTask<V>
Параметры типа:
V — тип результата задачи
Все реализуемые интерфейсы:
Serializable, Future<V>
Известные прямые подклассы:
CountedCompleter, RecursiveAction, RecursiveTask
public abstract class ForkJoinTask<V> extends Object implements Future<V>, Serializable
Абстрактный базовый класс для задач, выполняемых в ForkJoinPool. ForkJoinTask — это сущность, подобная потоку, но значительно более легковесная, чем обычный поток. В ForkJoinPool большое количество задач и подзадач может обслуживаться небольшим числом фактических потоков, однако это сопряжено с некоторыми ограничениями использования.

«Главная» ForkJoinTask начинает выполнение, когда её явно отправляют в ForkJoinPool или, если она ещё не участвует в вычислении ForkJoin, запускают в ForkJoinPool.commonPool() с помощью fork(), invoke() или связанных методов. После запуска она обычно запускает другие подзадачи. Как следует из названия этого класса, во многих программах, использующих ForkJoinTask, применяются только методы fork() и join() или их производные, например invokeAll. Однако этот класс также предоставляет ряд других методов, которые могут пригодиться при расширенном использовании, а также механизмы расширения, позволяющие поддерживать новые формы обработки fork/join.

ForkJoinTask — это облегчённая форма Future. Эффективность ForkJoinTasks обусловлена рядом ограничений (которые лишь частично могут быть проверены статически), отражающих их основное назначение: вычислительные задачи, вычисляющие чистые функции или работающие с полностью изолированными объектами. Основные механизмы координации — это fork(), организующий асинхронное выполнение, и join(), который ожидает вычисления результата задачи. В вычислениях желательно избегать методов и блоков synchronized и сводить к минимуму другие блокирующие механизмы синхронизации, за исключением объединения с другими задачами или использования средств синхронизации, таких как Phaser, которые, как заявлено, взаимодействуют с планированием fork/join. Задачи, допускающие разбиение на подзадачи, также не должны выполнять блокирующий ввод-вывод и в идеале должны обращаться к переменным, полностью независимым от тех, к которым обращаются другие выполняющиеся задачи. Соблюдение этих рекомендаций в некоторой степени обеспечивается запретом на выбрасывание проверяемых исключений, таких как IOExceptions. Однако при вычислениях всё же могут возникать непроверяемые исключения, которые повторно выбрасываются при попытке вызывающего кода объединиться с такими задачами. К ним также могут относиться RejectedExecutionException, возникающие при исчерпании внутренних ресурсов, например при невозможности выделить внутренние очереди задач. Повторно выбрасываемые исключения ведут себя так же, как обычные исключения, но, если возможно, содержат трассировки стека (отображаемые, например, с помощью ex.printStackTrace()) как потока, инициировавшего вычисление, так и потока, фактически обнаружившего исключение; как минимум содержится трассировка последнего.

Можно определять и использовать ForkJoinTask, которые могут блокироваться, однако при этом необходимо учитывать ещё три момента: (1) Завершение лишь небольшого числа других задач, если таковые вообще есть, должно зависеть от задачи, блокирующейся при внешней синхронизации или вводе-выводе. Асинхронные задачи событийного типа, которые никогда не объединяются с другими задачами (например, наследующие CountedCompleter), часто относятся к этой категории. (2) Чтобы свести к минимуму влияние на ресурсы, задачи должны быть небольшими; в идеале они должны выполнять только действие, которое может блокироваться. (3) Если не используется API ForkJoinPool.ManagedBlocker или количество потенциально заблокированных задач заведомо меньше уровня ForkJoinPool.getParallelism() пула, пул не может гарантировать наличие достаточного количества потоков для обеспечения прогресса или высокой производительности.

Основной метод ожидания завершения задачи и получения её результата — join(), однако есть несколько вариантов: методы Future.get() поддерживают прерываемое и/или ограниченное по времени ожидание завершения и сообщают результаты, используя соглашения Future. Метод invoke() семантически эквивалентен fork(); join(), но всегда пытается начать выполнение в текущем потоке. «Тихие» варианты этих методов не извлекают результаты и не сообщают об исключениях. Они могут быть полезны при выполнении набора задач, если обработку результатов или исключений нужно отложить до завершения всех задач. Метод invokeAll (доступный в нескольких вариантах) выполняет наиболее распространённый тип параллельного вызова: запускает набор задач и объединяется со всеми ними.

В наиболее типичных случаях пара fork/join действует подобно вызову (fork) и возврату (join) из параллельной рекурсивной функции. Как и при других видах рекурсивных вызовов, возврат (join) должен выполняться в порядке от самых вложенных к внешним. Например, a.fork(); b.fork(); b.join(); a.join();, вероятно, будет значительно эффективнее, чем объединение с a до b.

Состояние выполнения задач можно проверять с разной степенью детализации: isDone() возвращает true, если задача завершилась любым способом (в том числе если она была отменена до выполнения); isCompletedNormally() возвращает true, если задача завершилась без отмены и исключения; isCancelled() возвращает true, если задача была отменена (в этом случае getException() возвращает CancellationException); а isCompletedAbnormally() возвращает true, если задача была отменена или в ней возникло исключение; в этом случае getException() вернёт возникшее исключение или CancellationException.

Обычно от ForkJoinTask напрямую не наследуются. Вместо этого наследуются один из абстрактных классов, поддерживающих определённый стиль обработки fork/join: как правило, RecursiveAction — для большинства вычислений, не возвращающих результат, RecursiveTask — для вычислений, возвращающих результат, и CountedCompleter — для вычислений, в которых завершённые действия запускают другие действия. Обычно конкретный подкласс ForkJoinTask объявляет поля, содержащие параметры, инициализируемые в конструкторе, а затем определяет метод compute, который каким-либо образом использует управляющие методы, предоставляемые этим базовым классом.

Метод join() и его варианты подходят только тогда, когда зависимости завершения не образуют циклов, то есть параллельные вычисления можно представить в виде ориентированного ациклического графа (DAG). В противном случае при выполнении может возникнуть разновидность взаимной блокировки, когда задачи циклически ожидают друг друга. Однако эта платформа поддерживает другие методы и приёмы (например, использование Phaser, helpQuiesce() и complete(V)), которые могут пригодиться при создании пользовательских подклассов для задач, структура которых не задана статически в виде DAG. Для поддержки таких сценариев ForkJoinTask можно атомарно пометить значением short с помощью setForkJoinTaskTag(short) или compareAndSetForkJoinTaskTag(short, short) и проверить его с помощью getForkJoinTaskTag(). Реализация ForkJoinTask не использует эти методы protected или метки ни для каких целей, но они могут быть полезны при создании специализированных подклассов. Например, при параллельном обходе графа можно использовать предоставленные методы, чтобы не посещать повторно узлы или задачи, которые уже были обработаны. (Названия методов для работы с метками отчасти намеренно громоздки, чтобы поощрять определение методов, отражающих шаблоны их использования.)

Большинство базовых вспомогательных методов объявлены как final, чтобы запретить переопределение реализаций, неразрывно связанных с базовой платформой планирования легковесных задач. Разработчикам, создающим новые базовые стили обработки fork/join, следует как минимум реализовать методы protected exec(), setRawResult(V) и getRawResult(), а также добавить абстрактный вычислительный метод, который можно реализовать в подклассах, при необходимости используя другие методы protected, предоставляемые этим классом.

ForkJoinTask должны выполнять относительно небольшой объём вычислений. Большие задачи следует разбивать на более мелкие подзадачи, обычно с помощью рекурсивной декомпозиции. В качестве очень приблизительного правила задача должна выполнять более 100 и менее 10000 базовых вычислительных шагов и не должна содержать бесконечных циклов. Если задачи слишком велики, параллелизм не улучшит пропускную способность. Если они слишком малы, затраты на память и внутреннее обслуживание задач могут превысить затраты на обработку.

Этот класс предоставляет методы adapt для Runnable и Callable, которые могут быть полезны при совместном выполнении ForkJoinTasks и задач других типов. Если все задачи относятся к этому типу, рассмотрите возможность использования пула, созданного в режиме asyncMode.

ForkJoinTask являются Serializable, что позволяет использовать их в таких расширениях, как платформы удалённого выполнения. Имеет смысл сериализовать задачи только до или после выполнения, но не во время него. Во время самого выполнения сериализация не используется.

Начиная с версии:
1.7
См. также:
  • Сериализованная форма

Краткое описание вложенных классов

Вложенные классы/интерфейсы, объявленные в интерфейсе Future

Future.State

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

Конструктор Описание
ForkJoinTask()
Конструктор, предназначенный для вызова подклассами.

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

Модификатор и тип Метод Описание
static ForkJoinTask<?> adapt(Runnable runnable)
Возвращает новый ForkJoinTask, который выполняет метод run заданного Runnable в качестве действия и возвращает null при join().
static <T> ForkJoinTask<T> adapt(Runnable runnable, T result)
Возвращает новый ForkJoinTask, который выполняет метод run заданного Runnable в качестве действия и возвращает заданный результат при join().
static <T> ForkJoinTask<T> adapt(Callable<? extends T> callable)
Возвращает новый ForkJoinTask, который выполняет метод call заданного Callable в качестве действия и возвращает его результат при join(), преобразуя любые возникшие проверяемые исключения в RuntimeException.
static ForkJoinTask<?> adaptInterruptible(Runnable runnable)
Возвращает новый ForkJoinTask, который выполняет метод run заданного Runnable в качестве действия и возвращает null при join(), преобразуя любые возникшие проверяемые исключения в RuntimeException.
static <T> ForkJoinTask<T> adaptInterruptible(Runnable runnable, T result)
Возвращает новый ForkJoinTask, который выполняет метод run заданного Runnable в качестве действия и возвращает заданный результат при join(), преобразуя любые возникшие проверяемые исключения в RuntimeException.
static <T> ForkJoinTask<T> adaptInterruptible(Callable<? extends T> callable)
Возвращает новый ForkJoinTask, который выполняет метод call заданного Callable в качестве действия и возвращает его результат при join(), преобразуя любые возникшие проверяемые исключения в RuntimeException.
boolean cancel(boolean mayInterruptIfRunning)
Пытается отменить выполнение этой задачи.
final boolean compareAndSetForkJoinTaskTag(short expect, short update)
Атомарно и условно задаёт значение метки для этой задачи.
void complete(V value)
Завершает эту задачу и, если она ещё не была прервана или отменена, возвращает заданное значение в качестве результата последующих вызовов join и связанных операций.
void completeExceptionally(Throwable ex)
Завершает эту задачу аварийно и, если она ещё не была прервана или отменена, вызывает выбрасывание заданного исключения при join и связанных операциях.
Throwable exceptionNow()
Возвращает исключение, выброшенное задачей, не ожидая её завершения.
protected abstract boolean exec()
Немедленно выполняет базовое действие этой задачи и возвращает true, если к моменту возврата из этого метода гарантировано завершение задачи.
final ForkJoinTask<V> fork()
Организует асинхронное выполнение этой задачи в пуле, в котором выполняется текущая задача, если такой пул есть, или использует ForkJoinPool.commonPool(), если выполнение происходит не inForkJoinPool().
final V get()
При необходимости ожидает завершения вычисления, а затем получает его результат.
final V get(long timeout, TimeUnit unit)
При необходимости ожидает завершения вычисления в течение заданного времени, а затем получает его результат, если он доступен.
final Throwable getException()
Возвращает исключение, выброшенное базовым вычислением, или CancellationException, если задача отменена, либо null, если исключений нет или метод ещё не завершился.
final short getForkJoinTaskTag()
Возвращает метку этой задачи.
static ForkJoinPool getPool()
Возвращает пул, в котором работает текущий поток, или null, если текущий поток выполняется вне любого ForkJoinPool.
static int getQueuedTaskCount()
Возвращает приблизительное количество задач, созданных текущим рабочим потоком с помощью fork, но ещё не выполненных.
abstract V getRawResult()
Возвращает результат, который вернул бы join(), даже если задача завершилась аварийно, или null, если неизвестно, завершилась ли задача.
static int getSurplusQueuedTaskCount()
Возвращает приблизительную разницу между количеством локально поставленных в очередь задач текущего рабочего потока и количеством других рабочих потоков, которые могут их перехватить, или ноль, если этот поток не работает в ForkJoinPool.
static void helpQuiesce()
При необходимости выполняет задачи, пока пул, в котором размещена текущая задача, не перейдёт в состояние покоя.
static boolean inForkJoinPool()
Возвращает true, если текущий поток является ForkJoinWorkerThread, выполняющим вычисление ForkJoinPool.
final V invoke()
Начинает выполнение этой задачи, при необходимости ожидает её завершения и возвращает результат либо выбрасывает (непроверяемое) RuntimeException или Error, если это произошло при базовом вычислении.
static <T extends ForkJoinTask<?>>
Collection<T>
invokeAll(Collection<T> tasks)
Запускает все задачи из указанной коллекции и возвращает управление, когда условие isDone выполняется для каждой задачи или возникает непроверяемое исключение; в последнем случае исключение выбрасывается повторно.
static void invokeAll(ForkJoinTask<?>... tasks)
Запускает заданные задачи и возвращает управление, когда условие isDone выполняется для каждой задачи или возникает непроверяемое исключение; в последнем случае исключение выбрасывается повторно.
static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2)
Запускает заданные задачи и возвращает управление, когда условие isDone выполняется для каждой задачи или возникает непроверяемое исключение; в последнем случае исключение выбрасывается повторно.
final boolean isCancelled()
Возвращает true, если эта задача была отменена до нормального завершения.
final boolean isCompletedAbnormally()
Возвращает true, если эта задача выбросила исключение или была отменена.
final boolean isCompletedNormally()
Возвращает true, если эта задача завершилась без выбрасывания исключения и не была отменена.
final boolean isDone()
Возвращает true, если эта задача завершилась.
final V join()
Возвращает результат вычисления, когда оно завершено.
protected static ForkJoinTask<?> peekNextLocalTask()
Возвращает, но не снимает с очереди и не выполняет задачу, поставленную в очередь текущим потоком, но ещё не выполненную, если такая задача доступна немедленно.
protected static ForkJoinTask<?> pollNextLocalTask()
Снимает с очереди и возвращает, не выполняя, следующую задачу, поставленную в очередь текущим потоком, но ещё не выполненную, если текущий поток работает в ForkJoinPool.
protected static ForkJoinTask<?> pollSubmission()
Если текущий поток работает в ForkJoinPool, снимает с очереди и возвращает, не выполняя, задачу, отправленную в пул извне, если такая задача доступна.
protected static ForkJoinTask<?> pollTask()
Если текущий поток работает в ForkJoinPool, снимает с очереди и возвращает, не выполняя, следующую задачу, поставленную в очередь текущим потоком, но ещё не выполненную, если такая задача доступна; если она недоступна, возвращает задачу, созданную с помощью fork другим потоком, если такая задача доступна.
final void quietlyComplete()
Нормально завершает эту задачу, не задавая значение.
final void quietlyInvoke()
Начинает выполнение этой задачи и при необходимости ожидает её завершения, не возвращая результат и не выбрасывая исключение.
final void quietlyJoin()
Объединяется с этой задачей, не возвращая её результат и не выбрасывая исключение.
final boolean quietlyJoin(long timeout, TimeUnit unit)
Пытается объединиться с этой задачей и возвращает true, если она завершилась (возможно, аварийно) до истечения заданного времени ожидания и текущий поток не был прерван.
final boolean quietlyJoinUninterruptibly(long timeout, TimeUnit unit)
Пытается объединиться с этой задачей и возвращает true, если она завершилась (возможно, аварийно) до истечения заданного времени ожидания.
void reinitialize()
Сбрасывает внутреннее состояние учёта этой задачи, позволяя впоследствии выполнить fork.
V resultNow()
Возвращает вычисленный результат, не ожидая завершения.
final short setForkJoinTaskTag(short newValue)
Атомарно задаёт значение метки для этой задачи и возвращает прежнее значение.
protected abstract void setRawResult(V value)
Принудительно задаёт возвращаемое значение.
Future.State state()
Возвращает состояние вычисления.
boolean tryUnfork()
Пытается снять эту задачу с очереди выполнения.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

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

ForkJoinTask

public ForkJoinTask()
Конструктор для вызова из подклассов.

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

fork

public final ForkJoinTask<V> fork()
Асинхронно запускает выполнение этой задачи в пуле, в котором выполняется текущая задача, если это применимо, или в ForkJoinPool.commonPool(), если текущая задача не inForkJoinPool(). Хотя это не обязательно обеспечивается, повторный запуск задачи с помощью fork считается ошибкой использования, если задача не была завершена и повторно инициализирована. Последующие изменения состояния этой задачи или любых данных, с которыми она работает, не обязательно будут согласованно видны каким-либо потокам, кроме выполняющего её потока, если перед этим не был вызван join() или связанный метод либо isDone() не вернул true.
Возвращает:
this для упрощения использования

join

public final V join()
Возвращает результат вычисления после его завершения. Этот метод отличается от get() тем, что при аварийном завершении он приводит к RuntimeException или Error, а не к ExecutionException, а также тем, что прерывания вызывающего потока не приводят к досрочному возврату из метода с выбрасыванием InterruptedException.
Возвращает:
вычисленный результат

invoke

public final V invoke()
Начинает выполнение этой задачи, при необходимости ожидает её завершения и возвращает результат либо выбрасывает (непроверяемое) RuntimeException или Error, если это произошло при базовом вычислении.
Возвращает:
вычисленный результат

invokeAll

public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2)
Запускает указанные задачи и возвращает управление, когда для каждой задачи выполняется условие isDone либо возникает (непроверяемое) исключение, которое в этом случае повторно выбрасывается. Если исключение возникает более чем в одной задаче, этот метод выбрасывает любое из этих исключений. Если в одной задаче возникает исключение, другая задача может быть отменена. Однако состояние выполнения отдельных задач при возврате из-за исключения не гарантируется. Состояние каждой задачи можно определить с помощью getException() и связанных методов, чтобы проверить, была ли она отменена, завершилась нормально или с исключением либо осталась необработанной.
Параметры:
t1 — первая задача
t2 — вторая задача
Выбрасывает:
NullPointerException — если какая-либо задача равна null

invokeAll

public static void invokeAll(ForkJoinTask<?>... tasks)
Запускает указанные задачи и возвращает управление, когда для каждой задачи выполняется условие isDone либо возникает (непроверяемое) исключение, которое в этом случае повторно выбрасывается. Если исключение возникает более чем в одной задаче, этот метод выбрасывает любое из этих исключений. Если в одной задаче возникает исключение, остальные задачи могут быть отменены. Однако состояние выполнения отдельных задач при возврате из-за исключения не гарантируется. Состояние каждой задачи можно определить с помощью getException() и связанных методов, чтобы проверить, была ли она отменена, завершилась нормально или с исключением либо осталась необработанной.
Параметры:
tasks — задачи
Выбрасывает:
NullPointerException — если какая-либо задача равна null

invokeAll

public static <T extends ForkJoinTask<?>> Collection<T> invokeAll(Collection<T> tasks)
Запускает все задачи из указанной коллекции и возвращает управление, когда для каждой задачи выполняется условие isDone либо возникает (непроверяемое) исключение, которое в этом случае повторно выбрасывается. Если исключение возникает более чем в одной задаче, этот метод выбрасывает любое из этих исключений. Если в одной задаче возникает исключение, остальные задачи могут быть отменены. Однако состояние выполнения отдельных задач при возврате из-за исключения не гарантируется. Состояние каждой задачи можно определить с помощью getException() и связанных методов, чтобы проверить, была ли она отменена, завершилась нормально или с исключением либо осталась необработанной.
Параметры типа:
T — тип значений, возвращаемых задачами
Параметры:
tasks — коллекция задач
Возвращает:
аргумент tasks для упрощения использования
Выбрасывает:
NullPointerException — если tasks или любой её элемент равен null

cancel

public boolean cancel(boolean mayInterruptIfRunning)
Пытается отменить выполнение этой задачи. Попытка не удастся, если задача уже завершена или её не удалось отменить по другой причине. Если попытка успешна и выполнение этой задачи ещё не началось к моменту вызова cancel, выполнение задачи подавляется. После успешного возврата этого метода, если не был вызван reinitialize(), последующие вызовы isCancelled(), isDone() и cancel будут возвращать true, а вызовы join() и связанных методов приведут к CancellationException.

Этот метод можно переопределять в подклассах, но в таком случае необходимо обеспечить соблюдение этих свойств. В частности, сам метод cancel не должен выбрасывать исключения.

Этот метод предназначен для вызова другими задачами. Чтобы завершить текущую задачу, можно просто вернуть управление или выбросить непроверяемое исключение из метода вычисления либо вызвать completeExceptionally(Throwable).

Определено в:
cancel в интерфейсе Future<V>
Параметры:
mayInterruptIfRunning — это значение не влияет на реализацию по умолчанию, поскольку прерывания не используются для управления отменой.
Возвращает:
true, если эта задача теперь отменена

isDone

public final boolean isDone()
Описание скопировано из интерфейса: Future
Возвращает true, если эта задача завершена. Завершение может быть вызвано нормальным окончанием, исключением или отменой — во всех этих случаях метод возвращает true.
Определено в:
isDone в интерфейсе Future<V>
Возвращает:
true, если эта задача завершена

isCancelled

public final boolean isCancelled()
Описание скопировано из интерфейса: Future
Возвращает true, если эта задача была отменена до нормального завершения.
Определено в:
isCancelled в интерфейсе Future<V>
Возвращает:
true, если эта задача была отменена до завершения

isCompletedAbnormally

public final boolean isCompletedAbnormally()
Возвращает true, если эта задача выбросила исключение или была отменена.
Возвращает:
true, если эта задача выбросила исключение или была отменена

isCompletedNormally

public final boolean isCompletedNormally()
Возвращает true, если эта задача завершилась без выбрасывания исключения и не была отменена.
Возвращает:
true, если эта задача завершилась без выбрасывания исключения и не была отменена

state

public Future.State state()
Описание скопировано из интерфейса: Future
Возвращает состояние вычисления.
Определено в:
state в интерфейсе Future<V>
Возвращает:
состояние вычисления
Начиная с версии:
19

resultNow

public V resultNow()
Описание скопировано из интерфейса: Future
Возвращает вычисленный результат, не ожидая завершения.

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

    results = futures.stream()
               .filter(f -> f.state() == Future.State.SUCCESS)
               .map(Future::resultNow)
               .toList();
Определено в:
resultNow в интерфейсе Future<V>
Возвращает:
вычисленный результат
Начиная с версии:
19

exceptionNow

public Throwable exceptionNow()
Описание скопировано из интерфейса: Future
Возвращает исключение, выброшенное задачей, не ожидая завершения.

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

Определено в:
exceptionNow в интерфейсе Future<V>
Возвращает:
исключение, выброшенное задачей
Начиная с версии:
19

getException

public final Throwable getException()
Возвращает исключение, выброшенное базовым вычислением, или CancellationException, если задача отменена, или null, если исключения нет либо выполнение метода ещё не завершено.
Возвращает:
исключение или null, если исключения нет

completeExceptionally

public void completeExceptionally(Throwable ex)
Завершает эту задачу аварийно и, если она ещё не была прервана или отменена, приводит к выбрасыванию указанного исключения при вызове join и связанных операций. Этот метод можно использовать для вызова исключений в асинхронных задачах или принудительного завершения задач, которые иначе не завершились бы. Не рекомендуется использовать его в других ситуациях. Этот метод можно переопределить, однако переопределённые версии должны вызывать реализацию super, чтобы сохранить гарантии.
Параметры:
ex — исключение, которое нужно выбросить. Если это исключение не является RuntimeException или Error, фактически будет выброшено RuntimeException с причиной ex.

complete

public void complete(V value)
Завершает эту задачу и, если она ещё не была прервана или отменена, возвращает указанное значение в качестве результата последующих вызовов join и связанных операций. Этот метод можно использовать для предоставления результатов асинхронным задачам или для альтернативной обработки задач, которые иначе не завершились бы нормально. Не рекомендуется использовать его в других ситуациях. Этот метод можно переопределить, однако переопределённые версии должны вызывать реализацию super, чтобы сохранить гарантии.
Параметры:
value — значение результата этой задачи

quietlyComplete

public final void quietlyComplete()
Нормально завершает эту задачу, не устанавливая значение. Последнее значение, заданное с помощью setRawResult(V) (или null по умолчанию), будет возвращено в качестве результата последующих вызовов join и связанных операций.
Начиная с версии:
1.8

get

public final V get() throws InterruptedException, ExecutionException
При необходимости ожидает завершения вычисления, а затем получает его результат.
Определено в:
get в интерфейсе Future<V>
Возвращает:
вычисленный результат
Выбрасывает:
CancellationException — если вычисление было отменено
ExecutionException — если вычисление выбросило исключение
InterruptedException — если текущий поток не входит в ForkJoinPool и был прерван во время ожидания

get

public final V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
При необходимости ожидает завершения вычисления не дольше указанного времени, а затем получает его результат, если он доступен.
Определено в:
get в интерфейсе Future<V>
Параметры:
timeout — максимальное время ожидания
unit — единица измерения аргумента тайм-аута
Возвращает:
вычисленный результат
Выбрасывает:
CancellationException — если вычисление было отменено
ExecutionException — если вычисление выбросило исключение
InterruptedException — если текущий поток не входит в ForkJoinPool и был прерван во время ожидания
TimeoutException — если истекло время ожидания

quietlyJoin

public final void quietlyJoin()
Ожидает завершения этой задачи, не возвращая её результат и не выбрасывая её исключение. Этот метод может быть полезен при обработке коллекций задач, некоторые из которых были отменены или заведомо прерваны по другой причине.

quietlyInvoke

public final void quietlyInvoke()
Начинает выполнение этой задачи и при необходимости ожидает её завершения, не возвращая её результат и не выбрасывая её исключение.

quietlyJoin

public final boolean quietlyJoin(long timeout, TimeUnit unit) throws InterruptedException
Пытается дождаться завершения этой задачи и возвращает true, если она завершилась (возможно, с исключением) до истечения указанного времени и текущий поток не был прерван.
Параметры:
timeout — максимальное время ожидания
unit — единица измерения аргумента тайм-аута
Возвращает:
true, если эта задача завершилась
Выбрасывает:
InterruptedException — если текущий поток был прерван во время ожидания
Начиная с версии:
19

quietlyJoinUninterruptibly

public final boolean quietlyJoinUninterruptibly(long timeout, TimeUnit unit)
Пытается дождаться завершения этой задачи и возвращает true, если она завершилась (возможно, с исключением) до истечения указанного времени.
Параметры:
timeout — максимальное время ожидания
unit — единица измерения аргумента тайм-аута
Возвращает:
true, если эта задача завершилась
Начиная с версии:
19

helpQuiesce

public static void helpQuiesce()
При необходимости выполняет задачи, пока пул, в котором размещена текущая задача, не перейдёт в состояние покоя. Этот метод может быть полезен в сценариях, когда запускается множество задач, но ни одна из них явно не ожидается; вместо этого задачи выполняются до тех пор, пока все они не будут обработаны.

reinitialize

public void reinitialize()
Сбрасывает внутреннее состояние учёта этой задачи, позволяя впоследствии повторно вызвать fork. Этот метод позволяет многократно использовать задачу, но только если она никогда не запускалась с помощью fork либо была запущена, завершилась и все ожидающие вызовы join для неё также завершились. Поведение при любых других условиях использования не гарантируется. Этот метод может быть полезен при многократном выполнении заранее созданных деревьев подзадач в циклах.

После завершения этого метода isDone() сообщает false, а getException() сообщает null. Однако значение, возвращаемое getRawResult, не изменяется. Чтобы очистить это значение, можно вызвать setRawResult(null).

getPool

public static ForkJoinPool getPool()
Возвращает пул, в котором выполняется текущий поток, или null, если текущий поток выполняется вне какого-либо ForkJoinPool.

Этот метод возвращает null тогда и только тогда, когда inForkJoinPool() возвращает false.

Возвращает:
пул или null, если его нет

inForkJoinPool

public static boolean inForkJoinPool()
Возвращает true, если текущий поток является ForkJoinWorkerThread, выполняющим вычисление ForkJoinPool.
Возвращает:
true, если текущий поток является ForkJoinWorkerThread, выполняющим вычисление ForkJoinPool, или false в противном случае

tryUnfork

public boolean tryUnfork()
Пытается снять эту задачу с очереди выполнения. Обычно (но не гарантированно) попытка будет успешной, если эта задача была последней задачей, запущенной с помощью fork текущим потоком, и её выполнение ещё не началось в другом потоке. Этот метод может быть полезен для организации альтернативной локальной обработки задач, которые могли быть украдены, но не были.
Возвращает:
true, если задача была снята с очереди

getQueuedTaskCount

public static int getQueuedTaskCount()
Возвращает оценочное количество задач, запущенных с помощью fork текущим рабочим потоком, но ещё не выполненных. Это значение может быть полезно для эвристического принятия решений о запуске других задач.
Возвращает:
количество задач

getSurplusQueuedTaskCount

public static int getSurplusQueuedTaskCount()
Возвращает оценочное количество задач в локальной очереди текущего рабочего потока сверх числа других рабочих потоков, которые могут их украсть, или ноль, если этот поток не работает в ForkJoinPool. Это значение может быть полезно для эвристического принятия решений о запуске других задач. Во многих сценариях использования ForkJoinTask при установившемся режиме каждому рабочему потоку следует поддерживать небольшой постоянный избыток задач (например, 3) и выполнять вычисления локально, если этот порог превышен.
Возвращает:
избыточное количество задач, которое может быть отрицательным

getRawResult

public abstract V getRawResult()
Возвращает результат, который был бы возвращён методом join(), даже если эта задача завершилась аварийно, или null, если неизвестно, завершилась ли эта задача. Этот метод предназначен для упрощения отладки, а также для поддержки расширений. Не рекомендуется использовать его в других контекстах.
Возвращает:
результат или null, если задача не завершена

setRawResult

protected abstract void setRawResult(V value)
Принудительно задаёт указанное значение в качестве возвращаемого результата. Этот метод предназначен для поддержки расширений и, как правило, не должен вызываться в иных случаях.
Параметры:
value — значение

exec

protected abstract boolean exec()
Немедленно выполняет базовое действие этой задачи и возвращает true, если к моменту возврата из этого метода гарантируется завершение задачи. В противном случае метод может вернуть false, чтобы указать, что задача не обязательно завершена (или неизвестно, завершена ли она), например, при асинхронных действиях, требующих явных вызовов методов завершения. Метод также может выбросить (непроверяемое) исключение, указывающее на аварийное завершение. Этот метод предназначен для поддержки расширений и, как правило, не должен вызываться в иных случаях.
Возвращает:
true, если известно, что эта задача завершилась нормально

peekNextLocalTask

protected static ForkJoinTask<?> peekNextLocalTask()
Возвращает, но не снимает с очереди и не выполняет, задачу, поставленную в очередь текущим потоком, но ещё не выполненную, если такая задача немедленно доступна. Не гарантируется, что именно эта задача будет опрошена или выполнена следующей. И наоборот, этот метод может вернуть null, даже если задача существует, но не может быть доступна без конкуренции с другими потоками. Этот метод предназначен главным образом для поддержки расширений и вряд ли будет полезен в иных случаях.
Возвращает:
следующая задача или null, если доступных задач нет

pollNextLocalTask

protected static ForkJoinTask<?> pollNextLocalTask()
Снимает с очереди и возвращает, не выполняя, следующую задачу, поставленную в очередь текущим потоком, но ещё не выполненную, если текущий поток работает в ForkJoinPool. Этот метод предназначен главным образом для поддержки расширений и вряд ли будет полезен в иных случаях.
Возвращает:
следующая задача или null, если доступных задач нет

pollTask

protected static ForkJoinTask<?> pollTask()
Если текущий поток работает в ForkJoinPool, снимает с очереди и возвращает, не выполняя, следующую задачу, поставленную в очередь текущим потоком, но ещё не выполненную, если она доступна; если такой задачи нет, возвращает доступную задачу, запущенную с помощью fork каким-либо другим потоком. Доступность может быть временной, поэтому результат null не обязательно означает, что пул, в котором выполняется эта задача, находится в состоянии покоя. Этот метод предназначен главным образом для поддержки расширений и вряд ли будет полезен в иных случаях.
Возвращает:
задача или null, если доступных задач нет

pollSubmission

protected static ForkJoinTask<?> pollSubmission()
Если текущий поток работает в ForkJoinPool, снимает с очереди и возвращает, не выполняя, задачу, отправленную в пул извне, если такая задача доступна. Доступность может быть временной, поэтому результат null не обязательно означает, что пул находится в состоянии покоя. Этот метод предназначен главным образом для поддержки расширений и вряд ли будет полезен в иных случаях.
Возвращает:
задача или null, если доступных задач нет
Начиная с версии:
9

getForkJoinTaskTag

public final short getForkJoinTaskTag()
Возвращает тег этой задачи.
Возвращает:
тег этой задачи
Начиная с версии:
1.8

setForkJoinTaskTag

public final short setForkJoinTaskTag(short newValue)
Атомарно устанавливает значение тега этой задачи и возвращает старое значение.
Параметры:
newValue — новое значение тега
Возвращает:
предыдущее значение тега
Начиная с версии:
1.8

compareAndSetForkJoinTaskTag

public final boolean compareAndSetForkJoinTaskTag(short expect, short update)
Атомарно и при соблюдении условия устанавливает значение тега этой задачи. В частности, теги можно использовать как маркеры посещения в задачах, работающих с графами, например, в методах, которые проверяют: if (task.compareAndSetForkJoinTaskTag((short)0, (short)1)) перед обработкой; в противном случае выполнение прекращается, поскольку узел уже был посещён.
Параметры:
expect — ожидаемое значение тега
update — новое значение тега
Возвращает:
true при успехе; то есть если текущее значение было равно expect и изменено на update.
Начиная с версии:
1.8

adapt

public static ForkJoinTask<?> adapt(Runnable runnable)
Возвращает новый ForkJoinTask, который выполняет метод run указанного Runnable в качестве действия и возвращает результат null при вызове join().
Параметры:
runnable — действие Runnable
Возвращает:
задача

adapt

public static <T> ForkJoinTask<T> adapt(Runnable runnable, T result)
Возвращает новый ForkJoinTask, который выполняет метод run указанного Runnable в качестве действия и возвращает указанный результат при вызове join().
Параметры типа:
T — тип результата
Параметры:
runnable — действие Runnable
result — результат после завершения
Возвращает:
задача

adapt

public static <T> ForkJoinTask<T> adapt(Callable<? extends T> callable)
Возвращает новый ForkJoinTask, который выполняет метод call указанного Callable в качестве действия и возвращает его результат при вызове join(), преобразуя любые возникшие проверяемые исключения в RuntimeException.
Параметры типа:
T — тип результата Callable
Параметры:
callable — действие Callable
Возвращает:
задача

adaptInterruptible

public static <T> ForkJoinTask<T> adaptInterruptible(Callable<? extends T> callable)
Возвращает новую ForkJoinTask, которая выполняет метод call заданного Callable в качестве действия и возвращает его результат при вызове join(), преобразуя все возникшие проверяемые исключения в RuntimeException. Кроме того, вызовы cancel с mayInterruptIfRunning true попытаются прервать поток, выполняющий задачу.
Параметры типа:
T — тип результата вызываемого объекта
Параметры:
callable — действие вызываемого объекта
Возвращает:
задачу
С версии:
19

adaptInterruptible

public static <T> ForkJoinTask<T> adaptInterruptible(Runnable runnable, T result)
Возвращает новую ForkJoinTask, которая выполняет метод run заданного Runnable в качестве действия и возвращает заданный результат при вызове join(), преобразуя все возникшие проверяемые исключения в RuntimeException. Кроме того, вызовы cancel с mayInterruptIfRunning true попытаются прервать поток, выполняющий задачу.
Параметры типа:
T — тип результата
Параметры:
runnable — действие Runnable
result — результат по завершении
Возвращает:
задачу
С версии:
22

adaptInterruptible

public static ForkJoinTask<?> adaptInterruptible(Runnable runnable)
Возвращает новую ForkJoinTask, которая выполняет метод run заданного Runnable в качестве действия и возвращает null при вызове join(), преобразуя все возникшие проверяемые исключения в RuntimeException. Кроме того, вызовы cancel с mayInterruptIfRunning true попытаются прервать поток, выполняющий задачу.
Параметры:
runnable — действие Runnable
Возвращает:
задачу
С версии:
22

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/ForkJoinTask.html

Spec-Zone.ru

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