Класс 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 |
Возвращает новый ForkJoinTask, который выполняет метод run заданного Runnable в качестве действия и возвращает null при join(). |
static <T> ForkJoinTask |
adapt |
Возвращает новый ForkJoinTask, который выполняет метод run заданного Runnable в качестве действия и возвращает заданный результат при join(). |
static <T> ForkJoinTask |
adapt |
Возвращает новый ForkJoinTask, который выполняет метод call заданного Callable в качестве действия и возвращает его результат при join(), преобразуя любые возникшие проверяемые исключения в RuntimeException. |
static ForkJoinTask |
adaptInterruptible |
Возвращает новый ForkJoinTask, который выполняет метод
run заданного Runnable в качестве действия и возвращает null при join(), преобразуя любые возникшие проверяемые исключения в RuntimeException. |
static <T> ForkJoinTask |
adaptInterruptible |
Возвращает новый ForkJoinTask, который выполняет метод run заданного Runnable в качестве действия и возвращает заданный результат при join(), преобразуя любые возникшие проверяемые исключения в RuntimeException. |
static <T> ForkJoinTask |
adaptInterruptible |
Возвращает новый ForkJoinTask, который выполняет метод call заданного Callable в качестве действия и возвращает его результат при join(), преобразуя любые возникшие проверяемые исключения в RuntimeException. |
boolean |
cancel |
Пытается отменить выполнение этой задачи. |
final boolean |
compareAndSetForkJoinTaskTag |
Атомарно и условно задаёт значение метки для этой задачи. |
void |
complete |
Завершает эту задачу и, если она ещё не была прервана или отменена, возвращает заданное значение в качестве результата последующих вызовов join и связанных операций. |
void |
completeExceptionally |
Завершает эту задачу аварийно и, если она ещё не была прервана или отменена, вызывает выбрасывание заданного исключения при join и связанных операциях. |
Throwable |
exceptionNow() |
Возвращает исключение, выброшенное задачей, не ожидая её завершения. |
protected abstract boolean |
exec() |
Немедленно выполняет базовое действие этой задачи и возвращает true, если к моменту возврата из этого метода гарантировано завершение задачи. |
final ForkJoinTask |
fork() |
Организует асинхронное выполнение этой задачи в пуле, в котором выполняется текущая задача, если такой пул есть, или использует ForkJoinPool.commonPool(), если выполнение происходит не inForkJoinPool(). |
final V |
get() |
При необходимости ожидает завершения вычисления, а затем получает его результат. |
final V |
get |
При необходимости ожидает завершения вычисления в течение заданного времени, а затем получает его результат, если он доступен. |
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<?>> |
invokeAll |
Запускает все задачи из указанной коллекции и возвращает управление, когда условие isDone выполняется для каждой задачи или возникает непроверяемое исключение; в последнем случае исключение выбрасывается повторно. |
static void |
invokeAll |
Запускает заданные задачи и возвращает управление, когда условие isDone выполняется для каждой задачи или возникает непроверяемое исключение; в последнем случае исключение выбрасывается повторно. |
static void |
invokeAll |
Запускает заданные задачи и возвращает управление, когда условие 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 |
Пытается объединиться с этой задачей и возвращает true, если она завершилась (возможно, аварийно) до истечения заданного времени ожидания и текущий поток не был прерван. |
final boolean |
quietlyJoinUninterruptibly |
Пытается объединиться с этой задачей и возвращает true, если она завершилась (возможно, аварийно) до истечения заданного времени ожидания. |
void |
reinitialize() |
Сбрасывает внутреннее состояние учёта этой задачи, позволяя впоследствии выполнить fork. |
V |
resultNow() |
Возвращает вычисленный результат, не ожидая завершения. |
final short |
setForkJoinTaskTag |
Атомарно задаёт значение метки для этой задачи и возвращает прежнее значение. |
protected abstract void |
setRawResult |
Принудительно задаёт возвращаемое значение. |
Future.State |
state() |
Возвращает состояние вычисления. |
boolean |
tryUnfork() |
Пытается снять эту задачу с очереди выполнения. |
Подробное описание конструкторов
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).
isDone
public final boolean isDone()
Futuretrue, если эта задача завершена. Завершение может быть вызвано нормальным окончанием, исключением или отменой — во всех этих случаях метод возвращает true.isCancelled
public final boolean isCancelled()
Futuretrue, если эта задача была отменена до нормального завершения.- Определено в:
-
isCancelledв интерфейсеFuture<V> - Возвращает:
-
true, если эта задача была отменена до завершения
isCompletedAbnormally
public final boolean isCompletedAbnormally()
true, если эта задача выбросила исключение или была отменена.- Возвращает:
-
true, если эта задача выбросила исключение или была отменена
isCompletedNormally
public final boolean isCompletedNormally()
true, если эта задача завершилась без выбрасывания исключения и не была отменена.- Возвращает:
-
true, если эта задача завершилась без выбрасывания исключения и не была отменена
state
resultNow
public V resultNow()
FutureЭтот метод предназначен для случаев, когда вызывающий код знает, что задача уже успешно завершилась, например, при фильтрации потока объектов Future для отбора успешно завершившихся задач и использовании операции отображения для получения потока результатов.
results = futures.stream()
.filter(f -> f.state() == Future.State.SUCCESS)
.map(Future::resultNow)
.toList();
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
- Параметры:
-
timeout— максимальное время ожидания -
unit— единица измерения аргумента тайм-аута - Возвращает:
- true, если эта задача завершилась
- Выбрасывает:
-
InterruptedException— если текущий поток был прерван во время ожидания - Начиная с версии:
- 19
quietlyJoinUninterruptibly
public final boolean quietlyJoinUninterruptibly(long timeout, TimeUnit unit)
- Параметры:
-
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()
- Возвращает:
-
true, если задача была снята с очереди
getQueuedTaskCount
public static int getQueuedTaskCount()
- Возвращает:
- количество задач
getSurplusQueuedTaskCount
public static int getSurplusQueuedTaskCount()
- Возвращает:
- избыточное количество задач, которое может быть отрицательным
getRawResult
public abstract V getRawResult()
join(), даже если эта задача завершилась аварийно, или null, если неизвестно, завершилась ли эта задача. Этот метод предназначен для упрощения отладки, а также для поддержки расширений. Не рекомендуется использовать его в других контекстах.- Возвращает:
- результат или
null, если задача не завершена
setRawResult
protected abstract void setRawResult(V value)
- Параметры:
-
value— значение
exec
protected abstract boolean exec()
- Возвращает:
-
true, если известно, что эта задача завершилась нормально
peekNextLocalTask
protected static ForkJoinTask<?> peekNextLocalTask()
- Возвращает:
- следующая задача или
null, если доступных задач нет
pollNextLocalTask
protected static ForkJoinTask<?> pollNextLocalTask()
- Возвращает:
- следующая задача или
null, если доступных задач нет
pollTask
protected static ForkJoinTask<?> pollTask()
null не обязательно означает, что пул, в котором выполняется эта задача, находится в состоянии покоя. Этот метод предназначен главным образом для поддержки расширений и вряд ли будет полезен в иных случаях.- Возвращает:
- задача или
null, если доступных задач нет
pollSubmission
protected static ForkJoinTask<?> pollSubmission()
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
© 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