ForkJoinTask Clase

Definición

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
ForkJoinTask
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 , ForkJoinPoolo, si aún no se ha establecido en un cálculo de ForkJoin, comienza en los ForkJoinPool#commonPool() métodos a través #forkde , #invokeo 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 ForkJoinTasks 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 bde .

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 ); CancellationExceptiony #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, #helpQuiescey #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, #setRawResulty , al #getRawResultmismo 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 Objectobjeto .

(Heredado de Object)
Exception

Devuelve la excepción producida por el cálculo base, o si CancellationException se cancela, o null si no se ha completado ninguno o si el método aún no se ha completado.

ForkJoinTaskTag

Devuelve la etiqueta de esta tarea.

Handle

Identificador de la instancia de Android subyacente.

(Heredado de Object)
IsCancelled

Devuelve true si esta tarea se canceló antes de que se completara normalmente.

IsCompletedAbnormally

Devuelve true si esta tarea produjo una excepción o se canceló.

IsCompletedNormally

Devuelve true si esta tarea se completó sin iniciar una excepción y no se canceló.

IsDone

Devuelve true si esta tarea se completó.

JniIdentityHashCode

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)
JniPeerMembers

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

PeerReference

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)
Pool

Devuelve el grupo que hospeda el subproceso actual o null si el subproceso actual se está ejecutando fuera de forkJoinPool.

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 null si no se sabe que se ha completado esta tarea.

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 ForkJoinTask objeto que realiza el call método de la clase especificada Callable como su acción y devuelve su resultado tras #join, traduciendo las excepciones comprobadas encontradas en RuntimeException.

Adapt(IRunnable)

Devuelve un nuevo ForkJoinTask objeto que realiza el run método de la clase especificada Runnable como su acción y devuelve un resultado null en #join.

Adapt(IRunnable, Object)

Devuelve un nuevo ForkJoinTask objeto que realiza el run método de la clase especificada Runnable como su acción y devuelve el resultado especificado en #join.

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 join y las operaciones relacionadas.

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 join las operaciones relacionadas y .

Dispose()

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)
Dispose(Boolean)

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)
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 ForkJoinPool#commonPool() no #inForkJoinPooles .

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 true si el subproceso actual se ForkJoinWorkerThread ejecuta como cálculo de ForkJoinPool.

Invoke()

Comienza a realizar esta tarea, espera su finalización si es necesario y devuelve su resultado, o inicia un (desactivado) RuntimeException o Error si el cálculo subyacente lo hizo.

InvokeAll(ForkJoinTask, ForkJoinTask)

Bifurca las tareas especificadas y devuelve cuando isDone se mantiene para cada tarea o se produce una excepción (desactivada), en cuyo caso se vuelve a iniciar la excepción.

InvokeAll(ForkJoinTask[])

Bifurca todas las tareas de la colección especificada, que se devuelven cuando isDone se mantiene para cada tarea o se encuentra una excepción (desactivada), en cuyo caso se vuelve a iniciar la excepción.

InvokeAll(ICollection)

Bifurca todas las tareas de la colección especificada, que se devuelven cuando isDone se mantiene para cada tarea o se encuentra una excepción (desactivada), en cuyo caso se vuelve a iniciar la excepción.

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 fork.

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 .ForkJoinPool

(Heredado de Object)
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 .ForkJoinPool

(Heredado de Object)
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 .ForkJoinPool

(Heredado de Object)
IJavaPeerable.DisposeUnlessReferenced()

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)
IJavaPeerable.Finalized()

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)
IJavaPeerable.JniManagedPeerState

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

(Heredado de Object)

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 .ForkJoinPool

GetJniTypeName(IJavaPeerable)

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

GetAsync(IFuture)

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

GetAsync(IFuture, Int64, TimeUnit)

Clase base abstracta para las tareas que se ejecutan dentro de .ForkJoinPool

Se aplica a