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
. Однако этот класс также предоставляет ряд других методов, которые могут вступить в игру при расширенном использовании, а также механизмы расширения, которые позволяют поддерживать новые формы обработки вилки и соединения.
— ForkJoinTask
это упрощенная форма Future
. Эффективность ForkJoinTask
s проистекает из набора ограничений (которые лишь частично применяются статически), отражающих их 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 |
Возвращает класс среды выполнения данного объекта |
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>, <>прерывания< или> em, либо до истечения определенного количества реального времени. (Унаследовано от Object) |
Wait(Int64, Int32) |
Заставляет текущий поток ждать, пока он не будет пробужден, как правило, из-за <уведомления</>em>, <>прерывания< или> 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) |
Абстрактный базовый класс для задач, выполняемых |