2012-05-09 20 views
7

la clase en los ThreadPoolExecutor Java 6 SE docs tiene la siguiente method:Java subprocesos Ejecutor Vigilancia

public int getActiveCount()

Devuelve el número aproximado de hilos que se están ejecutando activamente tareas.

¿Cuál es el significado de aproximada y ejecutar activamente aquí?

¿Hay alguna garantía de que, si antes, durante y después de la llamada a getActiveCount()

  1. N las discusiones se han asignado a la piscina para la ejecución de tareas, y
  2. Ninguno de estos N los hilos están disponibles para una asignación de tarea adicional,

el número entero devuelto por getActiveCount() será exactamente N?

Si getActiveCount() no proporciona esta garantía, ¿hay alguna otra manera de obtener esta información de una manera más precisa?

preguntas para previos:

me han mirado Thread Pool Executor Monitoring Requirement y How to tell if there is an available thread in a thread pool in java, pero no responder a mis preguntas.

+0

¿Existe alguna necesidad específica para un 'ThreadPoolExecutor', podría utilizarse un método de fábrica como' Executors.newFixedThreadPool (N) 'en este caso? – posdef

+0

@posdef, necesito una cola de tareas delimitada. ¿Es posible con un 'newFixedThreadPool()'? –

+0

Bueno, lo que obtienes es un servicio ejecutor con un grupo de subprocesos del tamaño que defines. Verifique los javadocs si cumple con sus necesidades. De hecho, los he encontrado muy útiles :) – posdef

Respuesta

9

El motivo por el que es es aproximado porque el número podría cambiar durante el cálculo; eres multihilo Antes de que el cálculo finalice, un número diferente de hilos ahora podría estar activo (un hilo que estaba inactivo cuando está marcado ahora está activo).

Cuando dice "instancia de tiempo particular" ... eso realmente no significa nada. El cálculo no es instantáneo. El número que recibe es la mejor respuesta posible dada la naturaleza fluida/dinámica del grupo.

Si por oportunidad los cálculos se inicia y termina mientras que ninguno de los hilos en el estado de cambio de la piscina, entonces sí que el número es "exacta", pero sólo hasta que un subproceso del grupo cambia de estado, lo que significa que sólo podría ser "exacto" por 1 ms (o menos).

+0

No hay un "cambio de estado" en los hilos. He editado la pregunta apropiadamente. –

+0

Mi respuesta todavía se aplica; el último párrafo cubriría su escenario. Los párrafos anteriores describen por qué los documentos dicen * aproximado *: en muchos casos, su estado particular no existe cuando el grupo no está en flujo mientras se realiza el cálculo. –

+0

Brian - I * think * en la implementación actual de JDK, en realidad hay un bloqueo global, lo que significa que el número de subprocesos no cambiará al enumerarlos. Pero la definición de API obviamente deja abierta la posibilidad de que este no sea el caso en otras implementaciones/futuras. –

2

Creo que posiblemente esté confundiendo las cosas al introducir una noción de "reincorporarse al grupo" que realmente no existe en la implementación de ThreadPoolExecutor.

Cada subproceso de trabajo se encuentra continuamente esperando una tarea (efectivamente se encuentra en la parte superior de una cola de bloqueo). Cada una de las tareas entra en su cola, ese trabajador está "bloqueado", luego se ejecuta cualquier tarea de mantenimiento previa a la tarea, luego se ejecuta la tarea real, luego se realiza el mantenimiento posterior a la tarea, luego el trabajador se "desbloquea".

activeCount() le proporciona el número de subprocesos en el estado "bloqueado": observe que esto significa que podrían estar realizando una "limpieza" en el momento preciso de llamar a activeCount(), pero eso se contará como ' active ', debe haber una tarea realmente involucrada, ya sea que está por comenzar, actualmente o que acaba de ejecutarse.

Ya sea que eso concuerde con tu noción de "volver a unirte al grupo" no estoy seguro-- como digo, pareces estar inventando una noción de que estrictamente hablando no existe desde el punto de vista de ThreadPoolExecutor.

+0

Eso explica claramente la parte de 'ejecución activa'. Gracias por señalar la incoherencia. He actualizado la pregunta para eliminarla. –

Cuestiones relacionadas