ForkJoinTask Класс

Определение

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

[Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)]
[Java.Interop.JavaTypeParameters(new System.String[] { "V" })]
public abstract class ForkJoinTask : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable, Java.Util.Concurrent.IFuture
[<Android.Runtime.Register("java/util/concurrent/ForkJoinTask", DoNotGenerateAcw=true)>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "V" })>]
type ForkJoinTask = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
    interface IFuture
Наследование
ForkJoinTask
Производный
Атрибуты
Реализации

Комментарии

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв . — ForkJoinTask это потокоподобный объект, который имеет гораздо меньший вес, чем обычный поток. Огромное количество задач и подзадач может размещаться небольшим количеством фактических потоков в ForkJoinPool по цене некоторых ограничений использования.

"main" ForkJoinTask начинает выполнение, когда оно явно отправлено ForkJoinPoolв , или, если оно еще не участвует в вычислении ForkJoin, начато в ForkJoinPool#commonPool() с помощью #forkсвязанных методов , #invokeили . После запуска он, как правило, начинает другие подзадачи. Как указано в имени этого класса, во многих программах, использующих ForkJoinTask только методы #fork и #join, или производные, такие как #invokeAll(ForkJoinTask...) invokeAll. Однако этот класс также предоставляет ряд других методов, которые могут вступить в игру при расширенном использовании, а также механизмы расширения, которые позволяют поддерживать новые формы обработки вилки и соединения.

ForkJoinTask это упрощенная форма Future. Эффективность ForkJoinTasks проистекает из набора ограничений (которые лишь частично применяются статически), отражающих их main использования в качестве вычислительных задач, вычисляющих чистые функции или работающих с чисто изолированными объектами. Основными механизмами координации являются #fork, которые упорядочивает асинхронное выполнение, и #join, которые не выполняются до тех пор, пока не будет вычислен результат задачи. Вычисления в идеале должны избегать synchronized методов или блоков и должны свести к минимуму другие блокирующие синхронизации, кроме присоединения к другим задачам или использования синхронизаторов, таких как Phasers, которые объявляются для сотрудничества с планированием вилки и соединения. Разделенные задачи также не должны выполнять блокирующие операции ввода-вывода и в идеале должны обращаться к переменным, которые полностью не зависят от переменных, к которым обращаются другие выполняющиеся задачи. Эти рекомендации применяются слабо, не разрешая создавать проверенные исключения, например IOExceptions . Однако при вычислениях могут по-прежнему встречаться непроверенные исключения, которые повторно создаются вызывающим абонентам, пытающимся присоединиться к ним. Эти исключения могут также включать в себя RejectedExecutionException нехватку внутренних ресурсов, например сбой при выделении внутренних очередей задач. Повторные исключения ведут себя так же, как и обычные исключения, но, по возможности, содержат трассировки стека (как показано, например, с помощью ex.printStackTrace()) как потока, который инициировал вычисление, так и потока, на самом деле встречающегося с исключением; минимально только последнее.

Можно определить и использовать ForkJoinTasks, которые могут блокироваться, но для этого требуется три дополнительных соображения: (1) Выполнение нескольких, если какие-либо <>другие< задачи em/ em> должны зависеть от задачи, которая блокирует внешнюю синхронизацию или ввод-вывод. Асинхронные задачи в стиле событий, которые никогда не объединяются (например, подклассы CountedCompleter), часто попадают в эту категорию. (2) Чтобы свести к минимуму влияние ресурсов, задачи должны быть небольшими; в идеале выполняет только (возможно) действие блокировки. (3) Если ForkJoinPool.ManagedBlocker не используется API или известно, что количество заблокированных задач меньше уровня пула ForkJoinPool#getParallelism , пул не может гарантировать, что достаточное количество потоков будет доступно для обеспечения хода выполнения или высокой производительности.

Основным методом ожидания завершения и извлечения результатов задачи является #join, но существует несколько вариантов: методы Future#get поддерживают прерывание и (или) время ожидания завершения и отчеты о результатах с использованием Future соглашений. Метод #invoke семантически эквивалентен , fork(); join() но всегда пытается начать выполнение в текущем потоке. Формы "<em>quiet</em>" этих методов не извлекают результаты или исключения отчета. Они могут быть полезны, если выполняется набор задач, и необходимо отложить обработку результатов или исключений до завершения всех задач. Метод invokeAll (доступный в нескольких версиях) выполняет наиболее распространенную форму параллельного вызова: вилку набора задач и их объединение.

В наиболее типичных методах использования пара "вилка—соединение" действует как вызов (вилка) и возврат (соединение) из параллельной рекурсивной функции. Как и в случае с другими формами рекурсивных вызовов, возвраты (соединения) должны выполняться в первую очередь. Например, скорее всего, будет существенно более эффективным, a.fork(); b.fork(); b.join(); a.join(); чем присоединение a до b.

Состояние выполнения задач может запрашиваться на нескольких уровнях детализации: #isDone значение true, если задача была выполнена каким-либо образом (включая случай, когда задача была отменена без выполнения); #isCompletedNormally значение true, если задача завершена без отмены или возникновения исключения; #isCancelled имеет значение true, если задача была отменена (в этом случае #getException возвращает CancellationException); и #isCompletedAbnormally значение true, если задача была отменена или возникло исключение. В этом случае #getException возвращается либо обнаруженное исключение, либо CancellationException.

Класс ForkJoinTask обычно не является подклассом напрямую. Вместо этого вы подкласс одного из абстрактных классов, поддерживающих определенный стиль обработки вилки или соединения, обычно RecursiveAction для большинства вычислений, которые не возвращают результаты, RecursiveTask для тех, которые выполняют, и CountedCompleter для тех, в которых завершенные действия активируют другие действия. Как правило, конкретный подкласс ForkJoinTask объявляет поля, содержащие его параметры, установленные в конструкторе, а затем определяет compute метод, который каким-то образом использует методы управления, предоставляемые этим базовым классом.

Метод #join и его варианты подходят для использования только в том случае, если зависимости завершения являются ациклическими; то есть параллельные вычисления можно описать как направленный ациклический граф (DAG). В противном случае выполнение может столкнуться с взаимоблокировкой, так как задачи циклически ожидают друг друга. Однако эта платформа поддерживает другие методы и методы (например, использование Phaser, #helpQuiesceи #complete), которые могут использоваться при создании пользовательских подклассов для задач, которые статически не структурированы как группы доступности баз данных. Для поддержки такого использования ForkJoinTask может быть атомарным em помечен/em> со значением short с помощью #setForkJoinTaskTag или #compareAndSetForkJoinTaskTag и проверяться с помощью #getForkJoinTaskTag.<>< Реализация ForkJoinTask не использует эти protected методы или теги для каких-либо целей, но они могут использоваться при создании специализированных подклассов. Например, параллельные обходы графа могут использовать предоставленные методы, чтобы избежать повторного просмотра узлов или задач, которые уже были обработаны. (Имена методов для добавления тегов отчасти являются громоздкими, чтобы поощрять определение методов, отражающих их шаблоны использования.)

Большинство базовых методов поддержки — это final, чтобы предотвратить переопределение реализаций, которые изначально связаны с базовой упрощенной платформой планирования задач. Разработчики, создающие новые базовые стили обработки вилки и соединения, должны минимально реализовывать protected методы #exec, #setRawResultи #getRawResult, а также внедрять абстрактный вычислительный метод, который можно реализовать в его подклассах, возможно, полагаясь на другие protected методы, предоставляемые этим классом.

ForkJoinTasks должен выполнять относительно небольшие объемы вычислений. Большие задачи следует разделить на меньшие подзадачи, как правило, с помощью рекурсивного разложения. Как правило, задача должна выполнять более 100 и менее 10000 базовых вычислительных шагов и избегать неограниченного цикла. Если задачи слишком большие, параллелизм не может повысить пропускную способность. Если это слишком мало, то затраты на обслуживание памяти и внутренних задач могут перегружать обработку.

Этот класс предоставляет adapt методы для Runnable и Callable, которые могут использоваться при сочетании ForkJoinTasks выполнения с другими типами задач. Если все задачи имеют такой вид, рассмотрите возможность использования пула, созданного в <em>asyncMode</em>.

ForkJoinTasks — это Serializable, что позволяет использовать их в расширениях, таких как платформы удаленного выполнения. Рекомендуется сериализовать задачи только до или после выполнения, но не во время выполнения. Сериализация не зависит от самого выполнения.

Добавлено в версии 1.7.

Документация по Java для java.util.concurrent.ForkJoinTask.

Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом Android и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License.

Конструкторы

ForkJoinTask()

Конструктор для вызываемого подкласса.

ForkJoinTask(IntPtr, JniHandleOwnership)

Конструктор, используемый при создании управляемых представлений объектов JNI; вызывается средой выполнения.

Свойства

Class

Возвращает класс среды выполнения данного объекта Object.

(Унаследовано от Object)
Exception

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

ForkJoinTaskTag

Возвращает тег для этой задачи.

Handle

Дескриптор базового экземпляра Android.

(Унаследовано от Object)
IsCancelled

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

IsCompletedAbnormally

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

IsCompletedNormally

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

IsDone

Возвращает значение true , если эта задача завершена.

JniIdentityHashCode

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
JniPeerMembers

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

PeerReference

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
Pool

Возвращает пул, в котором размещен текущий поток, или null значение , если текущий поток выполняется за пределами forkJoinPool.

QueuedTaskCount

Возвращает оценку количества задач, которые были разветвлены текущим рабочим потоком, но еще не выполнены.

RawRawResult

Возвращает результат, который был бы возвращен Join(), даже если эта задача была выполнена аномально или null если эта задача не была завершена.

SurplusQueuedTaskCount

Возвращает оценку количества локально поставленных в очередь задач, удерживаемых текущим рабочим потоком, чем другие рабочие потоки, которые могут их украсть, или нулевое значение, если этот поток не работает в пуле ForkJoinPool.

ThresholdClass

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

ThresholdType

Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода.

Методы

Adapt(ICallable)

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

Adapt(IRunnable)

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

Adapt(IRunnable, Object)

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

Cancel(Boolean)

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

Clone()

Создает и возвращает копию этого объекта.

(Унаследовано от Object)
CompareAndSetForkJoinTaskTag(Int16, Int16)

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

Complete(Object)

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

CompleteExceptionally(Throwable)

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

Dispose()

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
Dispose(Boolean)

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
Equals(Object)

Указывает, равен ли какой-то другой объект этому объекту.

(Унаследовано от Object)
Exec()

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

Fork()

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

Get()

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

Get(Int64, TimeUnit)

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

GetHashCode()

Возвращает значение хэш-кода для объекта.

(Унаследовано от Object)
HelpQuiesce()

Возможно, выполняет задачи до тех пор, пока пул, в котором размещена текущая задача ForkJoinPool#isQuiescent, не замирает.

InForkJoinPool()

Возвращает значение true , если текущий ForkJoinWorkerThread поток выполняется как вычисление ForkJoinPool.

Invoke()

Начинает выполнение этой задачи, ожидает ее завершения, если это необходимо, и возвращает свой результат либо вызывает (не установлен флажок) RuntimeException или Error если это было выполнено базовым вычислением.

InvokeAll(ForkJoinTask, ForkJoinTask)

Вилки для заданных задач, возвращая isDone при обнаружении удержания для каждой задачи или (не проверяемого) исключения, в этом случае исключение повторно создается.

InvokeAll(ForkJoinTask[])

Вилки всех задач в указанной коллекции, возвращая isDone при обнаружении удержаний для каждой задачи или (не проверяемого) исключения, в этом случае исключение повторно создается.

InvokeAll(ICollection)

Вилки всех задач в указанной коллекции, возвращая isDone при обнаружении удержаний для каждой задачи или (не проверяемого) исключения, в этом случае исключение повторно создается.

JavaFinalize()

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

(Унаследовано от Object)
Join()

Возвращает результат вычисления по завершении #isDone.

Notify()

Пробуждение одного потока, ожидающего на мониторе этого объекта.

(Унаследовано от Object)
NotifyAll()

Активирует все потоки, ожидающие на мониторе этого объекта.

(Унаследовано от Object)
PeekNextLocalTask()

Возвращает, но не отменяет или не выполняет задачу, поставленную в очередь в текущем потоке, но еще не выполненную, если она сразу же доступна.

PollNextLocalTask()

Отменяет и возвращает, без выполнения, следующую задачу, поставленную в очередь текущего потока, но еще не выполненную, если текущий поток работает в пуле ForkJoinPool.

PollTask()

Если текущий поток работает в пуле ForkJoinPool, отменяет и возвращает, не выполняя, следующую задачу, поставленную в очередь текущего потока, но еще не выполненную, если она доступна, или, если она недоступна, задача, которая была разветвлена другим потоком, если она доступна.

QuietlyComplete()

Выполняет эту задачу обычно без задания значения.

QuietlyInvoke()

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

QuietlyJoin()

Присоединяет эту задачу, не возвращая ее результат или не вызывая исключения.

Reinitialize()

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

SetForkJoinTaskTag(Int16)

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

SetHandle(IntPtr, JniHandleOwnership)

Задает свойство Handle.

(Унаследовано от Object)
SetRawResult(Object)

Принудительно возвращает заданное значение в результате.

ToArray<T>()

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
ToString()

Возвращает строковое представление объекта.

(Унаследовано от Object)
TryUnfork()

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

UnregisterFromRuntime()

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
Wait()

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления/><em> или <прерывания></em>.

(Унаследовано от Object)
Wait(Int64)

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>em>, <>прерывания< или> em, либо до истечения определенного количества реального времени.

(Унаследовано от Object)
Wait(Int64, Int32)

Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>em>, <>прерывания< или> em, либо до истечения определенного количества реального времени.

(Унаследовано от Object)

Явные реализации интерфейса

IJavaPeerable.Disposed()

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
IJavaPeerable.DisposeUnlessReferenced()

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
IJavaPeerable.Finalized()

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
IJavaPeerable.JniManagedPeerState

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

(Унаследовано от Object)

Методы расширения

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверенное средой выполнения Android.

JavaCast<TResult>(IJavaObject)

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

GetJniTypeName(IJavaPeerable)

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

GetAsync(IFuture)

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

GetAsync(IFuture, Int64, TimeUnit)

Абстрактный базовый класс для задач, выполняемых ForkJoinPoolв .

Применяется к