ForkJoinTask Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Clase base abstracta para las tareas que se ejecutan dentro de .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
- Herencia
- Derivado
- Atributos
- Implementaciones
Comentarios
Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool
Es ForkJoinTask
una entidad similar a un subproceso que es mucho más ligera que un subproceso normal. Un gran número de tareas y subtareas pueden hospedarse en un pequeño número de subprocesos reales en forkJoinPool, a un precio de algunas limitaciones de uso.
Una "main" ForkJoinTask
comienza la ejecución cuando se envía explícitamente a , ForkJoinPool
o, si aún no se ha establecido en un cálculo de ForkJoin, comienza en los ForkJoinPool#commonPool()
métodos a través #fork
de , #invoke
o relacionados. Una vez iniciado, normalmente iniciará otras subtareas. Como se indica con el nombre de esta clase, muchos programas que usan ForkJoinTask
únicamente métodos #fork
y #join
, o derivados como #invokeAll(ForkJoinTask...) invokeAll
. Sin embargo, esta clase también proporciona una serie de otros métodos que pueden entrar en juego en usos avanzados, así como mecanismos de extensión que permiten admitir nuevas formas de procesamiento de bifurcación/combinación.
Un ForkJoinTask
es una forma ligera de Future
. La eficacia de ForkJoinTask
s se deriva de un conjunto de restricciones (que solo se pueden aplicar parcialmente estáticamente) que reflejan su uso principal como tareas computacionales que calculan funciones puras o funcionan en objetos puramente aislados. Los mecanismos de coordinación principales son #fork
, que organiza la ejecución asincrónica y #join
, que no continúa hasta que se haya calculado el resultado de la tarea. Idealmente, los cálculos deben evitar synchronized
métodos o bloques y minimizar otras sincronizaciones de bloqueo aparte de unir otras tareas o usar sincronizadores como phasers que se anuncian para cooperar con la programación de bifurcación o combinación. Las tareas subdividibles tampoco deben realizar bloqueos de E/S y, idealmente, tener acceso a variables que sean completamente independientes de las a las que acceden otras tareas en ejecución. Estas instrucciones se aplican de forma flexible al no permitir que se inicien excepciones comprobadas, como IOExceptions
. Sin embargo, los cálculos pueden encontrar excepciones no desactivadas, que se vuelven a iniciar a los autores de llamadas que intentan unirse a ellas. Estas excepciones también pueden incluir RejectedExecutionException
la lematización del agotamiento interno de recursos, como el error de asignación de colas de tareas internas. Las excepciones de nuevo se comportan de la misma manera que las excepciones normales, pero, cuando sea posible, contienen seguimientos de pila (como se muestra por ejemplo mediante ex.printStackTrace()
) del subproceso que inició el cálculo, así como del subproceso que realmente encuentra la excepción; mínimamente solo el segundo.
Es posible definir y usar ForkJoinTasks que pueden bloquearse, pero hacerlo requiere tres consideraciones adicionales: (1) Finalización de pocas si alguna <otra></em> tareas debe depender de una tarea que se bloquee en la sincronización externa o E/S. Las tareas asincrónicas de estilo de evento que nunca se unen (por ejemplo, esas subclases CountedCompleter
) a menudo se dividen en esta categoría. (2) Para minimizar el impacto en los recursos, las tareas deben ser pequeñas; lo ideal es realizar solo la acción de bloqueo (posiblemente). (3) A menos que se use la ForkJoinPool.ManagedBlocker
API, o se sabe que el número de tareas posiblemente bloqueadas es menor que el nivel del ForkJoinPool#getParallelism
grupo, el grupo no puede garantizar que haya suficientes subprocesos disponibles para garantizar el progreso o el buen rendimiento.
El método principal para esperar la finalización y la extracción de resultados de una tarea es #join
, pero hay varias variantes: los Future#get
métodos admiten esperas interrumpibles o cronometradas para la finalización y los resultados del informe mediante Future
convenciones. El método #invoke
es semánticamente equivalente a fork(); join()
pero siempre intenta iniciar la ejecución en el subproceso actual. Las formas "<em>quiet</em>" de estos métodos no extraen resultados ni notifican excepciones. Pueden ser útiles cuando se ejecuta un conjunto de tareas y es necesario retrasar el procesamiento de resultados o excepciones hasta que se completen todos. El método invokeAll
(disponible en varias versiones) realiza la forma más común de invocación paralela: bifurcar un conjunto de tareas y combinarlas todas.
En los usos más habituales, un par de bifurcación actúa como una llamada (bifurcación) y devuelve (combinación) de una función recursiva paralela. Como sucede con otras formas de llamadas recursivas, las devoluciones (combinaciones) se deben realizar en primer lugar. Por ejemplo, a.fork(); b.fork(); b.join(); a.join();
es probable que sea considerablemente más eficaz que unirse a
antes b
de .
El estado de ejecución de las tareas se puede consultar en varios niveles de detalle: #isDone
es true si una tarea se completó de alguna manera (incluido el caso en el que se canceló una tarea sin ejecutarse); #isCompletedNormally
es true si una tarea se completó sin cancelación o encontró una excepción; #isCancelled
es true si la tarea se canceló (en cuyo caso #getException
devuelve ); CancellationException
y #isCompletedAbnormally
es true si una tarea se canceló o encontró una excepción, en cuyo caso #getException
devolverá la excepción encontrada o CancellationException
.
La clase ForkJoinTask no suele estar subclasada directamente. En su lugar, subclase una de las clases abstractas que admiten un estilo determinado de procesamiento de bifurcación o combinación, normalmente RecursiveAction
para la mayoría de los cálculos que no devuelven resultados, RecursiveTask
para aquellos que sí y CountedCompleter
para aquellos en los que las acciones completadas desencadenan otras acciones. Normalmente, una subclase ForkJoinTask concreta declara los campos que componen sus parámetros, establecidos en un constructor y, a continuación, define un compute
método que usa de alguna manera los métodos de control proporcionados por esta clase base.
El método #join
y sus variantes son adecuados para su uso solo cuando las dependencias de finalización son acíclicas; es decir, el cálculo paralelo se puede describir como un gráfico acíclico dirigido (DAG). De lo contrario, las ejecuciones pueden encontrar una forma de interbloqueo, ya que las tareas esperan cíclicamente entre sí. Sin embargo, este marco admite otros métodos y técnicas (por ejemplo, el uso de Phaser
, #helpQuiesce
y #complete
) que pueden ser de uso en la construcción de subclases personalizadas para problemas que no están estructurados estáticamente como DAG. Para admitir estos usos, un ForkJoinTask puede etiquetarse atómicamente <em<>> con un short
valor mediante #setForkJoinTaskTag
o #compareAndSetForkJoinTaskTag
y comprobarse mediante .#getForkJoinTaskTag
La implementación de ForkJoinTask no usa estos protected
métodos ni etiquetas para ningún propósito, pero pueden ser de uso en la construcción de subclases especializadas. Por ejemplo, los recorridos de grafos paralelos pueden usar los métodos proporcionados para evitar volver a visitar nodos o tareas que ya se han procesado. (Los nombres de método para el etiquetado son masivos en parte para fomentar la definición de métodos que reflejan sus patrones de uso).
La mayoría de los métodos de compatibilidad base son final
, para evitar la invalidación de implementaciones que están intrínsecamente asociadas al marco de programación de tareas ligera subyacente. Los desarrolladores que crean nuevos estilos básicos de procesamiento de bifurcación y combinación deben implementar protected
mínimamente los métodos #exec
, #setRawResult
y , al #getRawResult
mismo tiempo que introducen un método computacional abstracto que se puede implementar en sus subclases, posiblemente confiando en otros protected
métodos proporcionados por esta clase.
ForkJoinTasks debe realizar cantidades relativamente pequeñas de cálculo. Las tareas grandes deben dividirse en subtareas más pequeñas, normalmente a través de la descomposición recursiva. Como regla general muy aproximada, una tarea debe realizar más de 100 y menos de 10000 pasos de cálculo básicos, y debe evitar bucles indefinidos. Si las tareas son demasiado grandes, el paralelismo no puede mejorar el rendimiento. Si es demasiado pequeño, la sobrecarga de mantenimiento de la tarea interna y la memoria pueden sobrecargar el procesamiento.
Esta clase proporciona adapt
métodos para Runnable
y Callable
, que pueden ser de uso al mezclar la ejecución de ForkJoinTasks
con otros tipos de tareas. Cuando todas las tareas tienen este formato, considere la posibilidad de usar un grupo construido en <em>asyncMode</em>.
ForkJoinTasks son Serializable
, lo que les permite usarse en extensiones como marcos de ejecución remota. Es razonable serializar las tareas solo antes o después, pero no durante la ejecución. La serialización no se basa en durante la ejecución misma.
Se agregó en la versión 1.7.
Documentación de Java para java.util.concurrent.ForkJoinTask
.
Las partes de esta página son modificaciones basadas en el trabajo creado y compartido por el proyecto de código y se usan según los términos descritos en la creative Commons 2.5.
Constructores
ForkJoinTask() |
Constructor para las subclases a las que se va a llamar. |
ForkJoinTask(IntPtr, JniHandleOwnership) |
Constructor utilizado al crear representaciones administradas de objetos JNI; llamado por el tiempo de ejecución. |
Propiedades
Class |
Devuelve la clase en tiempo de ejecución de este |
Exception |
Devuelve la excepción producida por el cálculo base, o si |
ForkJoinTaskTag |
Devuelve la etiqueta de esta tarea. |
Handle |
Identificador de la instancia de Android subyacente. (Heredado de Object) |
IsCancelled |
Devuelve |
IsCompletedAbnormally |
Devuelve |
IsCompletedNormally |
Devuelve |
IsDone |
Devuelve |
JniIdentityHashCode |
Clase base abstracta para las tareas que se ejecutan dentro de . |
JniPeerMembers |
Clase base abstracta para las tareas que se ejecutan dentro de . |
PeerReference |
Clase base abstracta para las tareas que se ejecutan dentro de . |
Pool |
Devuelve el grupo que hospeda el subproceso actual o |
QueuedTaskCount |
Devuelve una estimación del número de tareas bifurcadas por el subproceso de trabajo actual, pero que aún no se han ejecutado. |
RawRawResult |
Devuelve el resultado devuelto por Join(), incluso si esta tarea se completó de forma anómala o |
SurplusQueuedTaskCount |
Devuelve una estimación del número de tareas en cola local que mantiene el subproceso de trabajo actual que otros subprocesos de trabajo que podrían robarlas o cero si este subproceso no funciona en un ForkJoinPool. |
ThresholdClass |
Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código. |
ThresholdType |
Esta API admite la infraestructura mono para Android y no está pensada para usarse directamente desde el código. |
Métodos
Adapt(ICallable) |
Devuelve un nuevo |
Adapt(IRunnable) |
Devuelve un nuevo |
Adapt(IRunnable, Object) |
Devuelve un nuevo |
Cancel(Boolean) |
Intenta cancelar la ejecución de esta tarea. |
Clone() |
Crea y devuelve una copia de este objeto. (Heredado de Object) |
CompareAndSetForkJoinTaskTag(Int16, Int16) |
Establece condicionalmente el valor de etiqueta de esta tarea de forma atómica. |
Complete(Object) |
Completa esta tarea y, si aún no se ha anulado o cancelado, devuelve el valor especificado como resultado de las invocaciones posteriores de |
CompleteExceptionally(Throwable) |
Completa esta tarea de forma anómala y, si aún no se ha anulado o cancelado, hace que inicie la excepción dada en |
Dispose() |
Clase base abstracta para las tareas que se ejecutan dentro de . |
Dispose(Boolean) |
Clase base abstracta para las tareas que se ejecutan dentro de . |
Equals(Object) |
Indica si algún otro objeto es "igual a" este. (Heredado de Object) |
Exec() |
Realiza inmediatamente la acción base de esta tarea y devuelve true si, tras la devolución de este método, se garantiza que esta tarea se haya completado. |
Fork() |
Organiza la ejecución asincrónica de esta tarea en el grupo en el que se ejecuta la tarea actual, si procede, o mediante si |
Get() |
Espera si es necesario para que se complete el cálculo y, a continuación, recupera su resultado. |
Get(Int64, TimeUnit) |
Espera si es necesario para que se complete el cálculo como máximo y, a continuación, recupera su resultado, si está disponible. |
GetHashCode() |
Devuelve un valor de código hash del objeto. (Heredado de Object) |
HelpQuiesce() |
Posiblemente ejecuta tareas hasta que el grupo que hospeda la tarea actual ForkJoinPool#isQuiescent es inactivo. |
InForkJoinPool() |
Devuelve |
Invoke() |
Comienza a realizar esta tarea, espera su finalización si es necesario y devuelve su resultado, o inicia un (desactivado) |
InvokeAll(ForkJoinTask, ForkJoinTask) |
Bifurca las tareas especificadas y devuelve cuando |
InvokeAll(ForkJoinTask[]) |
Bifurca todas las tareas de la colección especificada, que se devuelven cuando |
InvokeAll(ICollection) |
Bifurca todas las tareas de la colección especificada, que se devuelven cuando |
JavaFinalize() |
Lo llama el recolector de elementos no utilizados en un objeto cuando la recolección de elementos no utilizados determina que no hay más referencias al objeto . (Heredado de Object) |
Join() |
Devuelve el resultado del cálculo cuando #isDone se realiza. |
Notify() |
Activa un único subproceso que está esperando en el monitor de este objeto. (Heredado de Object) |
NotifyAll() |
Activa todos los subprocesos que están esperando en el monitor de este objeto. (Heredado de Object) |
PeekNextLocalTask() |
Devuelve, pero no se programa ni ejecuta, una tarea puesta en cola por el subproceso actual, pero aún no ejecutada, si hay una disponible inmediatamente. |
PollNextLocalTask() |
Anula la programación y devuelve, sin ejecutar, la siguiente tarea puesta en cola por el subproceso actual, pero aún no ejecutada, si el subproceso actual funciona en forkJoinPool. |
PollTask() |
Si el subproceso actual funciona en forkJoinPool, anula la programación y devuelve, sin ejecutar, la siguiente tarea puesta en cola por el subproceso actual, pero aún no ejecutada, si hay una disponible o, si no está disponible, una tarea bifurcada por algún otro subproceso, si está disponible. |
QuietlyComplete() |
Completa esta tarea normalmente sin establecer un valor. |
QuietlyInvoke() |
Comienza a realizar esta tarea y espera su finalización si es necesario, sin devolver su resultado ni producir su excepción. |
QuietlyJoin() |
Combina esta tarea, sin devolver su resultado ni producir su excepción. |
Reinitialize() |
Restablece el estado interno de la contabilidad de esta tarea, lo que permite un posterior |
SetForkJoinTaskTag(Int16) |
Establece de forma atómica el valor de etiqueta de esta tarea y devuelve el valor anterior. |
SetHandle(IntPtr, JniHandleOwnership) |
Establece la propiedad Handle. (Heredado de Object) |
SetRawResult(Object) |
Obliga a que el valor especificado se devuelva como resultado. |
ToArray<T>() |
Clase base abstracta para las tareas que se ejecutan dentro de . |
ToString() |
Devuelve una representación de cadena del objeto. (Heredado de Object) |
TryUnfork() |
Intenta anular la programación de esta tarea para su ejecución. |
UnregisterFromRuntime() |
Clase base abstracta para las tareas que se ejecutan dentro de . |
Wait() |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser em notificado/em> o <em>interrumpido</em>.<>< (Heredado de Object) |
Wait(Int64) |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real. (Heredado de Object) |
Wait(Int64, Int32) |
Hace que el subproceso actual espere hasta que se despierte, normalmente por ser <em>notificado</em> o <em>interrumpido</em>, o hasta que haya transcurrido una cierta cantidad de tiempo real. (Heredado de Object) |
Implementaciones de interfaz explícitas
IJavaPeerable.Disposed() |
Clase base abstracta para las tareas que se ejecutan dentro de . |
IJavaPeerable.DisposeUnlessReferenced() |
Clase base abstracta para las tareas que se ejecutan dentro de . |
IJavaPeerable.Finalized() |
Clase base abstracta para las tareas que se ejecutan dentro de . |
IJavaPeerable.JniManagedPeerState |
Clase base abstracta para las tareas que se ejecutan dentro de . |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
Clase base abstracta para las tareas que se ejecutan dentro de . |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
Clase base abstracta para las tareas que se ejecutan dentro de . |
IJavaPeerable.SetPeerReference(JniObjectReference) |
Clase base abstracta para las tareas que se ejecutan dentro de . |
Métodos de extensión
JavaCast<TResult>(IJavaObject) |
Realiza una conversión de tipos comprobados en tiempo de ejecución de Android. |
JavaCast<TResult>(IJavaObject) |
Clase base abstracta para las tareas que se ejecutan dentro de . |
GetJniTypeName(IJavaPeerable) |
Clase base abstracta para las tareas que se ejecutan dentro de . |
GetAsync(IFuture) |
Clase base abstracta para las tareas que se ejecutan dentro de . |
GetAsync(IFuture, Int64, TimeUnit) |
Clase base abstracta para las tareas que se ejecutan dentro de . |