Класс ForkJoinTask<V>
- Все реализованные интерфейсы:
-
Serializable,Future<V>
- Прямые известные подклассы:
-
CountedCompleter,RecursiveAction,RecursiveTask
public abstract class ForkJoinTask<V> extends Object implements Future<V>, Serializable
ForkJoinPool. Задача является потокоподобной сущностью, намного более легкой, чем обычный поток. Огромное количество задач и подзадач может обрабатываться небольшим количеством реальных потоков в ForkJoinPool, при этом с некоторыми ограничениями использования. «Главная» ForkJoinTask начинает выполнение, когда она явно передана в ForkJoinPool, или, если она ещё не участвует в вычислении ForkJoin, запущена в ForkJoinPool.commonPool() через fork(), invoke() или связанные методы. После запуска она, как правило, запускает другие подзадачи. Как следует из названия этого класса, многие программы, использующие ForkJoinTask , используют только методы fork() и join(), или производные, такие как invokeAll. Однако этот класс также предоставляет ряд других методов, которые могут быть полезны в расширенных использованиях, а также механизмы расширения, которые позволяют поддерживать новые формы обработки fork/join.
Задача ForkJoinTask является лёгкой формой Future. Эффективность ForkJoinTask обусловлена набором ограничений (которые только частично статически проверяются), отражающих их основное использование как вычислительных задач, вычисляющих чистые функции или работающих с чисто изолированными объектами. Основными механизмами координации являются fork(), который организует асинхронное выполнение, и join(), который не продолжает выполнение, пока результат задачи не будет вычислен. Вычисления в идеале должны избегать методов или блоков synchronized, и должны минимизировать другую блокирующую синхронизацию, кроме объединения других задач или использования синхронизаторов, таких как фазы, которые рекламируются для сотрудничества с планированием 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) из параллельной рекурсивной функции. Как и в случае с другими формами рекурсивных вызовов, возвраты (join) должны выполняться от внутреннего к внешнему. Например, a.fork();
b.fork(); b.join(); a.join(); вероятно будет значительно эффективнее, чем объединение a до b.
Статус выполнения задач может быть запрошен на нескольких уровнях детализации: isDone() — true, если задача завершилась каким-либо образом (включая случай, когда задача была отменена без выполнения); isCompletedNormally() — true, если задача завершилась без отмены или возникновения исключения; isCancelled() — true, если задача была отменена (в этом случае getException(int) возвращает CancellationException); и isCompletedAbnormally() — true, если задача была отменена или столкнулась с исключением, в этом случае getException(int) вернёт либо возникшее исключение, либо 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, что позволяет использовать их в расширениях, таких как фреймворки удалённого выполнения. Целесообразно сериализовать задачи только до или после, но не во время выполнения. Сериализация не используется во время выполнения.
- Since:
- 1.7
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
ForkJoinTask() |
Конструктор для вызова подклассами. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static ForkJoinTask<?> |
adapt |
Возвращает новый ForkJoinTask, который выполняет метод run заданного Runnable в качестве своего действия и возвращает null-результат при join(). |
static <T> ForkJoinTask<T> |
adapt |
Возвращает новый ForkJoinTask, который выполняет метод run заданного Runnable в качестве своего действия и возвращает заданный результат при join(). |
static <T> ForkJoinTask<T> |
adapt |
Возвращает новый ForkJoinTask, который выполняет метод call заданного Callable в качестве своего действия и возвращает его результат при join(), переводя любые обнаруженные исключения checked в RuntimeException. |
boolean |
cancel |
Пытается отменить выполнение этой задачи. |
final boolean |
compareAndSetForkJoinTaskTag |
Атомарно условно устанавливает значение тега для этой задачи. |
void |
complete |
Завершает эту задачу и, если она ещё не прервана или отменена, возвращает заданное значение в качестве результата последующих вызовов join и связанных операций. |
void |
completeExceptionally |
Завершает эту задачу аномально и, если она ещё не прервана или отменена, заставляет её выбросить данное исключение при join и связанных операциях. |
protected abstract boolean |
exec() |
Немедленно выполняет базовое действие этой задачи и возвращает true, если при возвращении из этого метода эта задача гарантированно завершена. |
final ForkJoinTask<V> |
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() |
Возвращает оценку количества задач, которые были разветвлены текущей рабочей нитью, но ещё не выполнены. |
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, отменяет и возвращает, без выполнения, следующую задачу, помещенную в очередь текущей нитью, но ещё не выполненную, если она доступна, или если она недоступна, задачу, которая была разветвлена другой нитью, если она доступна. |
final void |
quietlyComplete() |
Завершает эту задачу нормально без задания значения. |
final void |
quietlyInvoke() |
Начинает выполнение этой задачи и ожидает её завершения при необходимости, не возвращая её результат и не выбрасывая её исключение. |
final void |
quietlyJoin() |
Присоединяется к этой задаче без возврата её результата или выброса её исключения. |
void |
reinitialize() |
Сбрасывает внутреннее состояние управления этой задачей, позволяя последующее fork. |
final short |
setForkJoinTaskTag |
Атомарно устанавливает значение тега для этой задачи и возвращает старое значение. |
protected abstract void |
setRawResult |
Принудительно возвращает заданное значение как результат. |
boolean |
tryUnfork() |
Пытается отменить расписание этой задачи для выполнения. |
Подробное описание конструкторов
ForkJoinTask
public ForkJoinTask()
Подробное описание методов
fork
public final ForkJoinTask<V> fork()
ForkJoinPool.commonPool(), если нет inForkJoinPool(). Хотя это не обязательно навязывается, ошибочным является разветвление задачи более одного раза, если она не завершена и не инициализирована повторно. Последующие изменения состояния этой задачи или любых данных, с которыми она работает, не обязательно последовательно наблюдаются никаким потоком, кроме того, который ее выполняет, если не предшествует вызов 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()
Futuretrue если эта задача завершена. Завершение может произойти из-за нормального завершения, исключения или отмены — во всех этих случаях этот метод вернет true.- Унаследован от:
-
isDoneв интерфейсеFuture<V> - Возвращает:
-
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если эта задача завершилась без генерации исключения и не была отменена
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()
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()
- Возвращает:
- количество избыточных задач, которое может быть отрицательным
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 - Возвращает:
- задачу
© 1993, 2021, 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/17/docs/api/java.base/java/util/concurrent/ForkJoinTask.html