Класс ForkJoinTask<V>
- java.lang.Object
-
- java.util.concurrent.ForkJoinTask<V>
- Все реализуемые интерфейсы:
-
Serializable,Future<V>
- Прямые известные подклассы:
-
CountedCompleter,RecursiveAction,RecursiveTask
public abstract class ForkJoinTask<V> extends Object implements Future<V>, Serializable
Абстрактный базовый класс для задач, выполняемых в ForkJoinPool. A ForkJoinTask — это потокоподобный объект, значительно более лёгкий, чем обычный поток. Огромное количество задач и подзадач может быть обработано небольшим количеством фактических потоков в ForkJoinPool, ценой некоторых ограничений в использовании.
«Главная» ForkJoinTask начинает выполнение, когда она явно отправляется в ForkJoinPool, или, если она ещё не задействована в вычислении ForkJoin, начинается в ForkJoinPool.commonPool() через fork(), invoke() или аналогичные методы. После запуска она обычно запускает другие подзадачи. Как следует из названия этого класса, многие программы, использующие ForkJoinTask , используют только методы fork() и join(), или производные, такие как invokeAll. Однако, этот класс также предоставляет ряд других методов, которые могут использоваться в продвинутых приложениях, а также механизмы расширения, которые позволяют поддерживать новые формы обработки fork/join.
A ForkJoinTask — это облегчённая форма Future. Эффективность ForkJoinTask обусловлена набором ограничений (которые только частично могут быть статически проверены), отражающих их основное использование в качестве вычислительных задач, вычисляющих чистые функции или работающих с чисто изолированными объектами. Основными механизмами координации являются fork(), организующий асинхронное выполнение, и join(), который не продолжается, пока результат задачи не будет вычислен. Вычисления должны по возможности избегать synchronized методов или блоков и минимизировать другую блокирующую синхронизацию, кроме объединения других задач или использования синхронизаторов, таких как Phasers, которые объявлены совместимыми с планированием fork/join. Разбиваемые задачи также не должны выполнять блокирующее ввод/вывод и, по возможности, должны обращаться к переменным, которые полностью независимы от переменных, используемых другими работающими задачами. Эти рекомендации слабо соблюдаются, так как не допускаются проверяемые исключения, такие как IOExceptions. Однако вычисления всё ещё могут столкнуться с непроверяемыми исключениями, которые перебрасываются вызывающим сторонам, пытающимся их объединить. Эти исключения могут дополнительно включать RejectedExecutionException, вызванные внутренним исчерпанием ресурсов, например, неудачей выделения внутренних очередей задач. Переброшенные исключения ведут себя так же, как обычные исключения, но, по возможности, содержат стековые следы (отображаемые, например, с помощью ex.printStackTrace()) как потока, который инициировал вычисление, так и потока, на котором фактически произошло исключение; минимально только последнего.
Возможна реализация и использование ForkJoinTasks, которые могут блокироваться, но это требует трёх дополнительных соображений: (1) Завершение каких-либо других задач должно зависеть от задачи, которая блокируется на внешней синхронизации или вводе/выводе. Задачи типа «событие» асинхронного типа, которые никогда не объединяются (например, те, которые наследуют от CountedCompleter), часто относятся к этой категории. (2) Чтобы минимизировать влияние на ресурсы, задачи должны быть небольшими; по идее, выполняя только (возможно) блокирующее действие. (3) Если не используется API ForkJoinPool.ManagedBlocker или количество потенциально заблокированных задач известно меньше уровня параллельности пула ForkJoinPool.getParallelism(), пул не может гарантировать, что будет достаточно потоков для обеспечения прогресса или хорошей производительности.
Основной метод ожидания завершения и извлечения результатов задачи — join(), но есть несколько вариантов: методы Future.get() поддерживают прерывимые и/или ограниченные по времени ожидания завершения и сообщают результаты, используя Future соглашения. Метод invoke() семантически эквивалентен fork(); join(), но всегда пытается начать выполнение в текущем потоке. «Бездействующие» формы этих методов не извлекают результаты или не сообщают об исключениях. Это может быть полезно, когда выполняется набор задач, и вам нужно отложить обработку результатов или исключений до тех пор, пока все не завершатся. Метод invokeAll (доступный в нескольких версиях) выполняет наиболее распространённую форму параллельного вызова: разделение набора задач и объединение их всех.
В самых типичных случаях пара fork-join действует как вызов (fork) и возврат (join) из параллельной рекурсивной функции. Как и в случае с другими видами рекурсивных вызовов, возвраты (объединения) должны выполняться от вложенного к внешнему. Например, a.fork();
b.fork(); b.join(); a.join(); вероятно будет значительно эффективнее, чем объединение a до b.
Состояние выполнения задач может быть запрошено на нескольких уровнях детализации: Future.isDone() равно true, если задача завершена каким-либо образом (включая случай, когда задача была отменена без выполнения); isCompletedNormally() равно true, если задача завершилась без отмены или возникновения исключения; Future.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 методы, предоставляемые этим классом.
ForkJoinTasks должны выполнять относительно небольшие объёмы вычислений. Крупные задачи следует разделять на более мелкие подзадачи, обычно путём рекурсивного разбиения. Приблизительно, задача должна выполнять более 100 и менее 10000 основных вычислительных шагов и избегать бесконечных циклов. Если задачи слишком большие, то параллелизм не может улучшить пропускную способность. Если слишком маленькие, то накладные расходы на память и внутреннее управление задачами могут перегрузить обработку.
Этот класс предоставляет adapt методы для Runnable и Callable, которые могут быть полезны при смешении выполнения ForkJoinTasks с другими типами задач. Если все задачи имеют такой вид, рассмотрите использование пула, созданного в режиме asyncMode.
ForkJoinTasks являются Serializable, что позволяет использовать их в расширениях, таких как фреймворки удалённого выполнения. Целесообразно сериализовать задачи только до или после, но не во время выполнения. Сериализация не используется во время самого выполнения.
- С:
- 1.7
- См. также:
- Сериализованная форма
Конструкторы
| Конструктор | Описание |
|---|---|
ForkJoinTask() |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
static ForkJoinTask<?> | adapt(Runnable runnable) | Возвращает новый |
static <T> ForkJoinTask<T> | adapt(Runnable runnable,
T result) | Возвращает новый |
static <T> ForkJoinTask<T> | adapt(Callable<? extends T> callable) | Возвращает новый |
boolean | cancel(boolean mayInterruptIfRunning) | Попытка отменить выполнение этой задачи. |
boolean | compareAndSetForkJoinTaskTag(short expect,
short update) | Атомарно условно устанавливает значение тега для этой задачи. |
void | complete(V value) | Завершает эту задачу и, если она ещё не прервана или отменена, возвращает заданное значение в качестве результата последующих вызовов |
void | completeExceptionally(Throwable ex) | Завершает эту задачу аномально и, если она ещё не прервана или отменена, заставляет её генерировать заданное исключение при |
protected abstract boolean | exec() | Немедленно выполняет базовое действие этой задачи и возвращает true, если при возвращении из этого метода эта задача гарантированно завершилась нормально. |
ForkJoinTask<V> | fork() | Организует асинхронное выполнение этой задачи в пуле, в котором выполняется текущая задача, если это применимо, или используя |
V | get() | Если необходимо, ожидает завершения вычисления и затем извлекает его результат. |
V | get(long timeout,
TimeUnit unit) | Если необходимо, ожидает завершения вычисления не более заданного времени и затем извлекает его результат, если он доступен. |
Throwable | getException() | Возвращает исключение, сгенерированное базовым вычислением, или |
short | getForkJoinTaskTag() | Возвращает тег для этой задачи. |
static ForkJoinPool | getPool() | Возвращает пул, в котором работает текущая нить, или |
static int | getQueuedTaskCount() | Возвращает оценку количества задач, которые были порождены текущей рабочей нитью, но ещё не выполнены. |
abstract V | getRawResult() | Возвращает результат, который был бы возвращён |
static int | getSurplusQueuedTaskCount() | Возвращает оценку того, на сколько больше локально очереди задач удерживает текущая рабочая нить, чем других рабочих нитей, которые могут их украсть, или ноль, если эта нить не работает в ForkJoinPool. |
static void | helpQuiesce() | Возможная выполнение задач до тех пор, пока пул, содержащий текущую задачу, не будет бездействовать. |
static boolean | inForkJoinPool() | Возвращает |
V | invoke() | Начинает выполнение этой задачи, ожидает её завершения при необходимости и возвращает её результат или генерирует (непроверенное) |
static <T extends ForkJoinTask<?>> | invokeAll(Collection<T> tasks) | Разветвляет все задачи в указанном списке, возвращаясь, когда |
static void | invokeAll(ForkJoinTask<?>... tasks) | Разветвляет заданные задачи, возвращаясь, когда |
static void | invokeAll(ForkJoinTask<?> t1,
ForkJoinTask<?> t2) | Разветвляет заданные задачи, возвращаясь, когда |
boolean | isCompletedAbnormally() | Возвращает |
boolean | isCompletedNormally() | Возвращает |
V | join() | Возвращает результат вычисления, когда оно завершено. |
protected static ForkJoinTask<?> | peekNextLocalTask() | Возвращает, но не отменяет или не выполняет, задачу, помещённую в очередь текущей нитью, но ещё не выполненную, если она сразу доступна. |
protected static ForkJoinTask<?> | pollNextLocalTask() | Отменяет и возвращает, без выполнения, следующую задачу, помещённую в очередь текущей нитью, но ещё не выполненную, если текущая нить работает в ForkJoinPool. |
protected static ForkJoinTask<?> | pollSubmission() | Если текущая нить работает в ForkJoinPool, отменяет и возвращает, без выполнения, задачу, внешне переданную в пул, если она доступна. |
protected static ForkJoinTask<?> | pollTask() | Если текущая нить работает в ForkJoinPool, отменяет и возвращает, без выполнения, следующую задачу, помещённую в очередь текущей нитью, но ещё не выполненную, если она доступна, или, если она недоступна, задачу, которая была порождена другой нитью, если она доступна. |
void | quietlyComplete() | Завершает эту задачу нормально без задания значения. |
void | quietlyInvoke() | Начинает выполнение этой задачи и ожидает её завершения при необходимости, не возвращая её результат и не генерируя её исключение. |
void | quietlyJoin() | Присоединяется к этой задаче, не возвращая её результат и не генерируя её исключение. |
void | reinitialize() | Сбрасывает внутреннее состояние учёта этой задачи, позволяя последующее |
short | setForkJoinTaskTag(short newValue) | Атомарно устанавливает значение тега для этой задачи и возвращает старое значение. |
protected abstract void | setRawResult(V value) | Принудительно заставляет возвращать заданное значение в качестве результата. |
boolean | tryUnfork() | Пытается отменить расписание этой задачи для выполнения. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Методы, объявленные в интерфейсе java.util.concurrent.Future
isCancelled, isDone Конструкторы
ForkJoinTask
public ForkJoinTask()
Методы
fork
public final ForkJoinTask<V> fork()
Организует асинхронное выполнение этой задачи в пуле, в котором выполняется текущая задача, если применимо, или с использованием ForkJoinPool.commonPool(), если нет inForkJoinPool(). Хотя это не обязательно, считается ошибкой использования раздваивать задачу более одного раза, если она не завершена и не перезапущена. Последующие изменения состояния этой задачи или любых данных, с которыми она работает, не обязательно последовательно наблюдаются никаким потоком, кроме выполняющего ее, если не предшествует вызов join() или связанных методов, или вызова Future.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(), последующие вызовы Future.isCancelled(), Future.isDone() и cancel вернут true, а вызовы join() и связанных методов приведут к CancellationException.
Этот метод может быть переопределен в подклассах, но в таком случае должен гарантировать, что эти свойства сохраняются. В частности, сам метод cancel не должен выбрасывать исключения.
Этот метод предназначен для вызова другими задачами. Чтобы завершить текущую задачу, можно просто вернуть или бросить непроверенное исключение из метода вычисления или вызвать completeExceptionally(Throwable).
- Задано в:
-
cancelв интерфейсеFuture<V> - Параметры:
-
mayInterruptIfRunning- это значение не влияет на реализацию по умолчанию, потому что прерывания не используются для управления отменением. - Возвращает:
-
trueесли эта задача теперь отменена
isCompletedAbnormally
public final boolean isCompletedAbnormally()
Возвращает true , если эта задача выбросила исключение или была отменена.
- Возвращает:
-
trueесли эта задача выбросила исключение или была отменена
isCompletedNormally
public final boolean isCompletedNormally()
Возвращает true , если эта задача завершилась без выброса исключения и не была отменена.
- Возвращает:
-
trueесли эта задача завершилась без выброса исключения и не была отменена
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- единица измерения времени аргумента timeout - Возвращает:
- вычисленный результат
- Исключения:
-
CancellationException- если вычисление было отменено -
ExecutionException- если вычисление выбросило исключение -
InterruptedException- если текущий поток не является членом ForkJoinPool и был прерван во время ожидания -
TimeoutException- если ожидание истекло
quietlyJoin
public final void quietlyJoin()
Присоединяется к этой задаче без возврата ее результата или выброса ее исключения. Этот метод может быть полезен при обработке наборов задач, когда некоторые были отменены или иным образом известны как прерванные.
quietlyInvoke
public final void quietlyInvoke()
Начинает выполнение этой задачи и ожидает ее завершения при необходимости, не возвращая ее результат и не выбрасывая ее исключение.
helpQuiesce
public static void helpQuiesce()
Возможно выполняет задачи, пока пул, содержащий текущую задачу, не станет бездействующим. Этот метод может быть полезен в проектах, в которых создается много задач, но ни одна из них явно не присоединяется, а выполняется до тех пор, пока все не будут обработаны.
reinitialize
public void reinitialize()
Сбрасывает внутреннее состояние учета этой задачи, позволяя последующее fork. Этот метод позволяет повторно использовать эту задачу, но только если повторное использование происходит, когда эта задача либо никогда не была разделена, либо была разделена, затем завершена и все ожидающие объединения этой задачи также завершены. Эффекты при других условиях использования не гарантируются. Этот метод может быть полезен при выполнении предварительно созданных деревьев подзадач в циклах.
По завершении этого метода, 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()
Возвращает оценку того, на сколько больше локально очереди задач удерживает текущий рабочий поток, чем других рабочих потоков, которые могут их украсть, или ноль, если этот поток не работает в ForkJoinPool. Это значение может быть полезным для эвристических решений о том, стоит ли разветвлять другие задачи. Во многих случаях использования ForkJoinTasks в установившемся состоянии каждый рабочий должен стремиться поддерживать небольшую постоянную избыточность (например, 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, отменяет планирование и возвращает без выполнения следующую задачу, помещенную в очередь текущим потоком, но еще не выполненную, если она доступна, или если нет, задачу, которая была разветвлённа другим потоком, если она доступна. Доступность может быть временной, поэтому результат 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 в качестве своего действия и возвращает нулевой результат при 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-действие - Возвращает:
- задачу
© 1993, 2020, 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/11/docs/api/java.base/java/util/concurrent/ForkJoinTask.html