Spec-Zone.ru › OpenJDK 17

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

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

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()
Описание скопировано из интерфейса: Future
Возвращает true если эта задача завершена. Завершение может произойти из-за нормального завершения, исключения или отмены — во всех этих случаях этот метод вернет true.
Унаследован от:
isDone в интерфейсе Future<V>
Возвращает:
true если эта задача завершена

isCancelled

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

isCompletedAbnormally

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

isCompletedNormally

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

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()
Возвращает оценку того, на сколько больше локально очередированных задач удерживает текущий рабочий поток, чем других рабочих потоков, которые могли бы их украсть, или ноль, если этот поток не работает в 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 в качестве своего действия и возвращает значение 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

Spec-Zone.ru

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