¿Qué son los grupos de subprocesos, grupos de subprocesos y colas de subprocesos de Java? ¿Cuál es la diferencia?
Hola, te lo puedo explicar en detalle:
Un grupo de hilos representa una colección de hilos. Además, los grupos de hilos también pueden contener otros grupos de hilos. Los grupos de subprocesos forman un árbol en el que cada grupo de subprocesos, excepto el grupo de subprocesos inicial, tiene un grupo de subprocesos principal.
Un hilo puede acceder a información sobre su propio grupo de hilos, pero no puede acceder a información sobre el grupo de hilos principal de su grupo de hilos ni sobre ningún otro grupo de hilos.
Grupo de subprocesos: podemos pasar tareas ejecutadas simultáneamente a un grupo de subprocesos en lugar de iniciar un nuevo subproceso para cada tarea ejecutada simultáneamente. Mientras haya subprocesos inactivos en el grupo, la tarea se asignará a un subproceso para su ejecución. Dentro del grupo de subprocesos, las tareas se insertan en una cola de bloqueo (Cola de bloqueo) y los subprocesos en el grupo de subprocesos recuperarán tareas de esta cola. Cuando se inserta una nueva tarea en la cola, un subproceso inactivo eliminará con éxito la tarea de la cola y la ejecutará.
Los grupos de subprocesos se utilizan a menudo en servidores multiproceso. Cada conexión que llega al servidor a través de la red se incluye en una tarea y se pasa al grupo de subprocesos. Los subprocesos en el grupo de subprocesos procesarán simultáneamente las solicitudes en la conexión. Más adelante profundizaremos en los detalles de la implementación de un servidor multiproceso en Java.
Cola de subprocesos: se refiere a la cola de programación que se forma cuando los subprocesos están congestionados.
Existen tres estrategias generales para la cola:
Envío directo. La opción predeterminada para las colas de trabajo es SynchronousQueue, que envía tareas directamente a los subprocesos sin retenerlas. Aquí, si no hay ningún subproceso disponible para ejecutar la tarea inmediatamente, el intento de poner la tarea en cola fallará, por lo que se construirá un nuevo subproceso. Esta estrategia evita bloqueos al procesar conjuntos de solicitudes que pueden tener dependencias internas. El envío directo normalmente requiere tamaños de piscina máximos ilimitados para evitar rechazar tareas recién enviadas. Esta política permite que los subprocesos ilimitados crezcan cuando los comandos llegan en sucesión a un número promedio que excede lo que la cola puede manejar.
Cola ilimitada. El uso de una cola ilimitada (por ejemplo, un LinkedBlockingQueue sin una capacidad predefinida) dará como resultado nuevas tareas esperando en la cola mientras todos los subprocesos de corePoolSize están ocupados. De esta manera, no se crearán más subprocesos que corePoolSize. (Por lo tanto, el valor de MaximumPoolSize no es válido). Las colas ilimitadas son adecuadas para su uso cuando cada tarea es completamente independiente de otras tareas, es decir, la ejecución de tareas no se afecta entre sí, por ejemplo, en un servidor de páginas web. Este tipo de cola se puede utilizar para manejar ráfagas transitorias de solicitudes. Esta estrategia permite que los subprocesos ilimitados tengan la posibilidad de crecer cuando los comandos llegan consecutivamente a un número promedio que excede lo que la cola puede manejar.
Cola acotada. Las colas limitadas (como ArrayBlockingQueue) ayudan a evitar el agotamiento de los recursos cuando se utilizan tamaños máximos de piscinas limitados, pero pueden ser difíciles de ajustar y controlar. El tamaño de la cola y el tamaño máximo del grupo pueden requerir compensaciones: el uso de colas grandes y grupos pequeños puede minimizar el uso de la CPU, los recursos del sistema operativo y la sobrecarga de cambio de contexto, pero puede dar como resultado una reducción artificial del rendimiento. Si las tareas se bloquean con frecuencia (por ejemplo, si son límites de E/S), el sistema puede programar más subprocesos de los que usted permite. El uso de colas pequeñas normalmente requiere tamaños de grupo más grandes y un mayor uso de CPU, pero puede generar una sobrecarga de programación inaceptable, que también puede reducir el rendimiento.