Поделиться через


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. Однако этот класс также предоставляет ряд других методов, которые могут играть в расширенных использовании, а также механики расширений, которые позволяют поддерживать новые формы обработки вилки или соединения.

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

Можно определить и использовать ForkJoinTasks, которые могут блокироваться, но это требует трех дополнительных рекомендаций: (1) Завершение нескольких, если какие-либо>< другие< или эм-задачи> должны зависеть от задачи, которая блокирует внешнюю синхронизацию или ввод-вывод. Асинхронные задачи в стиле событий, которые никогда не присоединяются (например, к подклассам), часто попадают в эту категорию 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 верно, если задача выполнена каким-либо образом (включая случай, когда задача была отменена без выполнения); #isCompletedNormally имеет значение true, если задача завершена без отмены или возникновения исключения; #isCancelled имеет значение true, если задача была отменена (в этом случае #getException возвращается CancellationExceptionзначение ); и #isCompletedAbnormally имеет значение, если задача была отменена или обнаружена исключение, В этом случае #getException возвращается обнаруженное исключение или CancellationException.

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

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

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

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

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

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

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

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

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

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

ForkJoinTask()

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

ForkJoinTask(IntPtr, JniHandleOwnership)

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

Свойства

Class

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

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

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

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 в качестве его действия, и возвращает результат NULL после #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 или <>эм прервано< или> до тех пор, пока не истекло определенное количество реального времени.

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

Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>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.

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