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
- Наследование
- Производный
- Атрибуты
- Реализации
Комментарии
Абстрактный базовый класс для задач, выполняемых в пределах ForkJoinPool
. Это ForkJoinTask
сущность, похожая на поток, которая гораздо легче, чем обычный поток. Огромное количество задач и подзадач может размещаться небольшим количеством фактических потоков в ForkJoinPool по цене некоторых ограничений использования.
"main" ForkJoinTask
начинает выполнение, когда оно явно отправляется ForkJoinPool
в или, если оно еще не участвует в вычислении ForkJoin, начинается через ForkJoinPool#commonPool()
#fork
#invoke
или связанные методы. После начала обычно начинается другие подзадачи. Как указано именем этого класса, многие программы используют ForkJoinTask
только методы #fork
и #join
производные, например #invokeAll(ForkJoinTask...) invokeAll
. Однако этот класс также предоставляет ряд других методов, которые могут играть в расширенных использовании, а также механики расширений, которые позволяют поддерживать новые формы обработки вилки или соединения.
A ForkJoinTask
— это упрощенная форма Future
. Эффективность ForkJoinTask
s обусловлена набором ограничений (которые являются лишь частично статически применимыми), отражающими их основное использование в качестве вычислительных задач, вычисляющих чистые функции или работающих на чисто изолированных объектах. Основными механизмами координации являются #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
методы и Callable
Runnable
может использоваться при перемешивание выполнения 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 |
Возвращает класс среды выполнения этого |
Exception |
Возвращает исключение, вызываемое базовым вычислением, или если оно отменено, или |
ForkJoinTaskTag |
Возвращает тег для этой задачи. |
Handle |
Дескриптор базового экземпляра Android. (Унаследовано от Object) |
IsCancelled |
Возвращает, |
IsCompletedAbnormally |
Возвращает, |
IsCompletedNormally |
Возвращает, |
IsDone |
Возвращает, |
JniIdentityHashCode |
Абстрактный базовый класс для задач, выполняемых в пределах |
JniPeerMembers |
Абстрактный базовый класс для задач, выполняемых в пределах |
PeerReference |
Абстрактный базовый класс для задач, выполняемых в пределах |
Pool |
Возвращает пул, в котором размещается текущий поток, или |
QueuedTaskCount |
Возвращает оценку количества задач, которые были вилированы текущим рабочим потоком, но еще не выполнены. |
RawRawResult |
Возвращает результат, который будет возвращен Join(), даже если эта задача завершена ненормально или |
SurplusQueuedTaskCount |
Возвращает оценку того, сколько более локальных задач хранятся текущим рабочим потоком, чем есть другие рабочие потоки, которые могут украсть их, или ноль, если этот поток не работает в ForkJoinPool. |
ThresholdClass |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
ThresholdType |
Этот API поддерживает инфраструктуру Mono для Android и не предназначен для использования непосредственно из кода. |
Методы
Adapt(ICallable) |
Возвращает новый |
Adapt(IRunnable) |
Возвращает новый |
Adapt(IRunnable, Object) |
Возвращает новый |
Cancel(Boolean) |
Пытается отменить выполнение этой задачи. |
Clone() |
Создает и возвращает копию этого объекта. (Унаследовано от Object) |
CompareAndSetForkJoinTaskTag(Int16, Int16) |
Атомарно задает значение тега для этой задачи. |
Complete(Object) |
Завершает эту задачу, а если она еще не прервана или отменена, возвращает заданное значение в результате последующих вызовов |
CompleteExceptionally(Throwable) |
Завершает эту задачу ненормально, а если она еще не прервана или отменена, вызывает исключение при |
Dispose() |
Абстрактный базовый класс для задач, выполняемых в пределах |
Dispose(Boolean) |
Абстрактный базовый класс для задач, выполняемых в пределах |
Equals(Object) |
Указывает, равен ли другой объект этому объекту. (Унаследовано от Object) |
Exec() |
Немедленно выполняет базовое действие этой задачи и возвращает значение true, если после возврата из этого метода эта задача гарантированно завершена. |
Fork() |
Упорядочивает асинхронное выполнение этой задачи в пуле, в котором выполняется текущая задача, если применимо, или используется, |
Get() |
Ожидает завершения вычисления, а затем извлекает результат. |
Get(Int64, TimeUnit) |
Ожидает, если это необходимо, по крайней мере заданное время для завершения вычисления, а затем извлекает его результат, если он доступен. |
GetHashCode() |
Возвращает значение хэш-кода для объекта. (Унаследовано от Object) |
HelpQuiesce() |
Возможно, выполнение задач выполняется до тех пор, пока пул, на котором размещена текущая задача ForkJoinPool#isQuiescent, не будет включена в очередь. |
InForkJoinPool() |
Возвращает, |
Invoke() |
Начинает выполнение этой задачи, ожидает завершения при необходимости и возвращает его результат или вызывает (снято) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
Вилки заданных задач, возвращая |
InvokeAll(ForkJoinTask[]) |
В этом случае возникает повторная обработка всех задач в указанной коллекции, возвращающаяся при |
InvokeAll(ICollection) |
В этом случае возникает повторная обработка всех задач в указанной коллекции, возвращающаяся при |
JavaFinalize() |
Вызывается сборщиком мусора в объекте, когда сборка мусора определяет, что больше ссылок на объект нет. (Унаследовано от Object) |
Join() |
Возвращает результат вычисления при выполнении #isDone. |
Notify() |
Пробуждение одного потока, ожидающего монитора этого объекта. (Унаследовано от Object) |
NotifyAll() |
Просыпает все потоки, ожидающие монитора этого объекта. (Унаследовано от Object) |
PeekNextLocalTask() |
Возвращает, но не отменяет или не выполняет задачу, в очередь текущего потока, но еще не выполнена, если она немедленно доступна. |
PollNextLocalTask() |
Отменяет и возвращается без выполнения следующей задачи, в очереди текущего потока, но еще не выполнена, если текущий поток работает в ForkJoinPool. |
PollTask() |
Если текущий поток работает в ForkJoinPool, отменяет и возвращает, не выполняя, следующая задача, вложенная текущим потоком, но еще не выполнена, если она доступна, или если она недоступна, задача, которая была вилирована другим потоком, если она доступна, если она доступна. |
QuietlyComplete() |
Обычно выполняет эту задачу без задания значения. |
QuietlyInvoke() |
Начинает выполнение этой задачи и ожидает завершения при необходимости, не возвращая результат или бросая исключение. |
QuietlyJoin() |
Присоединяет эту задачу, не возвращая результат или не вызывая исключение. |
Reinitialize() |
Сбрасывает состояние внутренней бухгалтерии этой задачи, позволяя последующему |
SetForkJoinTaskTag(Int16) |
Атомарно задает значение тега для этой задачи и возвращает старое значение. |
SetHandle(IntPtr, JniHandleOwnership) |
Задает свойство Handle. (Унаследовано от Object) |
SetRawResult(Object) |
Принудительно возвращает заданное значение в результате. |
ToArray<T>() |
Абстрактный базовый класс для задач, выполняемых в пределах |
ToString() |
Возвращает строковое представление объекта. (Унаследовано от Object) |
TryUnfork() |
Пытается отменить эту задачу для выполнения. |
UnregisterFromRuntime() |
Абстрактный базовый класс для задач, выполняемых в пределах |
Wait() |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>помощи уведомления</em> или <эм>прерванного</em>. (Унаследовано от Object) |
Wait(Int64) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прервано< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
Wait(Int64, Int32) |
Приводит к тому, что текущий поток будет ждать, пока он не проснется, как правило, при <>получении уведомления</>em или <>эм прервано< или> до тех пор, пока не истекло определенное количество реального времени. (Унаследовано от Object) |
Явные реализации интерфейса
IJavaPeerable.Disposed() |
Абстрактный базовый класс для задач, выполняемых в пределах |
IJavaPeerable.DisposeUnlessReferenced() |
Абстрактный базовый класс для задач, выполняемых в пределах |
IJavaPeerable.Finalized() |
Абстрактный базовый класс для задач, выполняемых в пределах |
IJavaPeerable.JniManagedPeerState |
Абстрактный базовый класс для задач, выполняемых в пределах |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Абстрактный базовый класс для задач, выполняемых в пределах |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Абстрактный базовый класс для задач, выполняемых в пределах |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Абстрактный базовый класс для задач, выполняемых в пределах |
Методы расширения
JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверяемого средой выполнения Android. |
JavaCast<TResult>(IJavaObject) |
Абстрактный базовый класс для задач, выполняемых в пределах |
GetJniTypeName(IJavaPeerable) |
Абстрактный базовый класс для задач, выполняемых в пределах |
GetAsync(IFuture) |
Абстрактный базовый класс для задач, выполняемых в пределах |
GetAsync(IFuture, Int64, TimeUnit) |
Абстрактный базовый класс для задач, выполняемых в пределах |