Класс 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)

Возвращает новый ForkJoinTask, выполняющий метод run заданного Runnable в качестве своего действия, и возвращает нулевое значение при join().

static <T> ForkJoinTask<T> adapt​(Runnable runnable, T result)

Возвращает новый ForkJoinTask, выполняющий метод run заданного Runnable в качестве своего действия, и возвращает заданное значение при join().

static <T> ForkJoinTask<T> adapt​(Callable<? extends T> callable)

Возвращает новый ForkJoinTask, выполняющий метод call заданного Callable в качестве своего действия, и возвращает его результат при join(), переводя любые возникшие исключения с проверкой в RuntimeException.

boolean cancel​(boolean mayInterruptIfRunning)

Попытка отменить выполнение этой задачи.

boolean compareAndSetForkJoinTaskTag​(short expect, short update)

Атомарно условно устанавливает значение тега для этой задачи.

void complete​(V value)

Завершает эту задачу и, если она ещё не прервана или отменена, возвращает заданное значение в качестве результата последующих вызовов join и связанных операций.

void completeExceptionally​(Throwable ex)

Завершает эту задачу аномально и, если она ещё не прервана или отменена, заставляет её генерировать заданное исключение при join и связанных операциях.

protected abstract boolean exec()

Немедленно выполняет базовое действие этой задачи и возвращает true, если при возвращении из этого метода эта задача гарантированно завершилась нормально.

ForkJoinTask<V> fork()

Организует асинхронное выполнение этой задачи в пуле, в котором выполняется текущая задача, если это применимо, или используя ForkJoinPool.commonPool(), если нет inForkJoinPool().

V get()

Если необходимо, ожидает завершения вычисления и затем извлекает его результат.

V get​(long timeout, TimeUnit unit)

Если необходимо, ожидает завершения вычисления не более заданного времени и затем извлекает его результат, если он доступен.

Throwable getException()

Возвращает исключение, сгенерированное базовым вычислением, или CancellationException при отмене, или null если нет или если метод ещё не завершен.

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.

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 выполняется для каждой задачи или возникает (непроверенное) исключение, в таком случае исключение повторно генерируется.

boolean isCompletedAbnormally()

Возвращает true если эта задача сгенерировала исключение или была отменена.

boolean isCompletedNormally()

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

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()

Сбрасывает внутреннее состояние учёта этой задачи, позволяя последующее fork.

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

Spec-Zone .ru
спецификации, руководства, описания, API