ForkJoinPool se detiene durante invokeAll / join

Trato de usar unForkJoinPool para paralelizar mis cálculos intensivos de CPU. Mi comprensión de un ForkJoinPool es que continúa funcionando siempre que cualquier tarea esté disponible para ser ejecutada. Desafortunadamente, con frecuencia observé los subprocesos de trabajo inactivos / en espera, por lo que no todas las CPU se mantienen ocupadas. A veces incluso observé hilos de trabajadores adicionales.

No esperaba esto, ya que traté estrictamente de usarno bloqueo Tareas. Mi observación es muy similar a la deForkJoinPool parece desperdiciar un hilo. Después de depurar mucho en ForkJoinPool tengo una conjetura:

Utilicé invokeAll () para distribuir el trabajo en una lista de subtareas. Después de que invokeAll () terminó de ejecutar la primera tarea, comienza a unirse a las otras. Esto funciona bien, hasta que la siguiente tarea a unirse esté en la parte superior de la cola de ejecución. Desafortunadamente, envié tareas adicionales de forma asíncrona sin unirme a ellas. Esperaba que el marco de trabajo de ForkJoin continuara ejecutando esas tareas primero y luego volviera a unir las tareas restantes.

Pero parece que no funciona de esta manera. En su lugar, el subproceso de trabajo se detiene en la llamada a la espera () hasta que la tarea a la espera de estar lista (probablemente ejecutada por otro subproceso de trabajador). No lo verifiqué, pero parece ser una falla general de llamar a join ().

ForkJoinPool proporciona unaasyncMode, pero este es un parámetro global y no se puede utilizar para envíos individuales. Pero me gusta ver mis tareas bifurcadas asincrónicamente para ser ejecutadas pronto.

Entonces, ¿por qué ForkJoinTask.doJoin () no ejecuta simplemente cualquier tarea disponible en la parte superior de su cola hasta que se prepara (ya sea ejecutada por sí misma o robada por otros)?

Respuestas a la pregunta(3)

Su respuesta a la pregunta