¿Cuál es exactamente la diferencia entre el tamaño del grupo principal y el tamaño máximo del grupo cuando hablamos en términos de ThreadPoolExecutor
?
¿Se puede explicar con la ayuda de un ejemplo?
java
asynchronous
threadpoolexecutor
usuario2568266
fuente
fuente
Respuestas:
De esta publicación de blog :
fuente
allowCoreThreadTimeOut(boolean)
que permite eliminar los subprocesos centrales después de un tiempo de inactividad determinado. Establecer esto en verdadero y establecercore threads
=max threads
permite que el grupo de subprocesos escale entre 0 ymax threads
.SI ejecuta subprocesos> corePoolSize & <maxPoolSize , cree un nuevo subproceso si la cola de tareas total está llena y está llegando una nueva.
Formulario doc: (Si hay más de Documento de corePoolSize pero menos de maximumPoolSize ejecución, se un nuevo subproceso solo si la cola está llena).
Ahora, tome un ejemplo simple,
Aquí, 5 es el corePoolSize , lo que significa que Jvm creará un nuevo hilo para una nueva tarea para las primeras 5 tareas. y otras tareas se agregarán a la cola hasta que la cola se llene (50 tareas).
10 es el maxPoolSize : JVM puede crear un máximo de 10 subprocesos. Significa que si ya hay 5 tareas / subprocesos en ejecución y la cola está llena con 50 tareas pendientes y si una nueva solicitud / tarea más está llegando a la cola, JVM creará nuevos subprocesos hasta 10 (subprocesos totales = 5 anteriores + 5 nuevos) ;
nuevo ArrayBlockingQueue (50) = es un tamaño total de cola; puede poner 50 tareas en cola.
una vez que los 10 subprocesos se estén ejecutando y si llega una nueva tarea, esa nueva tarea será rechazada.
Reglas para crear subprocesos internamente por SUN:
Si el número de subprocesos es menor que corePoolSize, cree un nuevo subproceso para ejecutar una nueva tarea.
Si la cantidad de subprocesos es igual (o mayor que) corePoolSize, coloque la tarea en la cola.
Si la cola está llena y el número de subprocesos es menor que maxPoolSize, cree un nuevo subproceso para ejecutar tareas.
Si la cola está llena y el número de subprocesos es mayor o igual que maxPoolSize, rechace la tarea.
Espero, esto es HelpFul ... y por favor corríjanme si me equivoco ...
fuente
Del doc :
Además:
fuente
Si decide crear
ThreadPoolExecutor
manualmente en lugar de utilizar laExecutors
clase de fábrica, deberá crear y configurar uno utilizando uno de sus constructores. El constructor más extenso de esta clase es:Como puede ver, puede configurar:
Limitar el número de tareas en cola
Limitar la cantidad de tareas simultáneas que se están ejecutando, dimensionar su grupo de subprocesos, representa un gran beneficio para su aplicación y su entorno de ejecución en términos de predictibilidad y estabilidad: una creación de subprocesos ilimitada eventualmente agotará los recursos en tiempo de ejecución y su aplicación podría experimentar como consecuencia , graves problemas de rendimiento que pueden conducir incluso a la inestabilidad de la aplicación.
Esa es una solución para solo una parte del problema: está limitando la cantidad de tareas que se ejecutan, pero no está limitando la cantidad de trabajos que se pueden enviar y poner en cola para su ejecución posterior. La aplicación experimentará escasez de recursos más adelante, pero eventualmente lo experimentará si la tasa de envío supera constantemente la tasa de ejecución.
La solución a este problema es: Proporcionar una cola de bloqueo al ejecutor para retener las tareas en espera. En el caso de que la cola se llene, la tarea enviada será "rechazada". los
RejectedExecutionHandler
invoca cuando se rechaza el envío de una tarea, y es por eso que el verbo rechazado se citó en el elemento anterior. Puede implementar su propia política de rechazo o utilizar una de las políticas integradas proporcionadas por el marco.Las políticas de rechazo predeterminadas hacen que el ejecutor lance un
RejectedExecutionException
. Sin embargo, otras políticas integradas le permiten:fuente
Fuente
Las reglas para el tamaño de un
ThreadPoolExecutor's
piscina generalmente se entienden mal, porque no funciona de la manera que usted cree que debería o de la manera que usted desea.Toma este ejemplo. El tamaño del grupo de subprocesos inicial es 1, el tamaño del grupo principal es 5, el tamaño máximo del grupo es 10 y la cola es 100.
Sun's way: a medida que las solicitudes lleguen en subprocesos, se crearán hasta 5, luego se agregarán tareas a la cola hasta que llegue a 100. Cuando la cola esté llena, se crearán nuevos subprocesos hasta
maxPoolSize
. Una vez que todos los hilos estén en uso y la cola esté llena, las tareas serán rechazadas. A medida que la cola se reduce, también lo hace el número de subprocesos activos.Forma anticipada por el usuario: a medida que las solicitudes lleguen en subprocesos, se crearán hasta 10, luego las tareas se agregarán a la cola hasta que llegue a 100, momento en el que se rechazarán. El número de subprocesos cambiará de nombre al máximo hasta que la cola esté vacía. Cuando la cola está vacía, los hilos morirán hasta que queden
corePoolSize
.La diferencia es que los usuarios quieren comenzar a aumentar el tamaño del grupo antes y quieren que la cola sea más pequeña, mientras que el método Sun quiere mantener el tamaño del grupo pequeño y solo aumentarlo una vez que la carga sea excesiva.
Aquí están las reglas de Sun para la creación de hilos en términos simples:
corePoolSize
, cree un nuevo subproceso para ejecutar una nueva tarea.corePoolSize
, coloque la tarea en la cola.maxPoolSize
, cree un nuevo subproceso para ejecutar tareas.maxPoolSize
, rechace la tarea. Lo más largo y corto es que los nuevos subprocesos solo se crean cuando la cola se llena, por lo que si está utilizando una cola ilimitada, la cantidad de subprocesos no excederácorePoolSize
.Para una explicación más completa, obténgalo de boca de los caballos:
ThreadPoolExecutor
documentación API.Hay una publicación en el foro realmente buena que le explica cómo
ThreadPoolExecutor
funciona con ejemplos de código: http://forums.sun.com/thread.jspa?threadID=5401400&tstart=0Más información: http://forums.sun.com/thread.jspa?threadID=5224557&tstart=450
fuente
Puede encontrar la definición de los términos corepoolsize y maxpoolsize en el javadoc. http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
El enlace de arriba tiene la respuesta a su pregunta. Sin embargo, solo para dejarlo claro. La aplicación seguirá creando subprocesos hasta que llegue a corePoolSize. Creo que la idea aquí es que estos muchos subprocesos deberían ser suficientes para manejar la entrada de tareas. Si surge una nueva tarea después de que se crean los subprocesos corePoolSize, las tareas se pondrán en cola. Una vez que la cola está llena, el ejecutor comenzará a crear nuevos hilos. Es una especie de equilibrio. Lo que esencialmente significa es que la entrada de tareas es más que la capacidad de procesamiento. Por lo tanto, Executor comenzará a crear nuevos subprocesos nuevamente hasta que alcance el número máximo de subprocesos. Nuevamente, se crearán nuevos hilos si y solo si la cola está llena.
fuente
Buena explicación en este blog:
Ilustración
Salida:
fuente
Del libro Conceptos básicos de la concurencia de Java :
CorePoolSize : ThreadPoolExecutor tiene un atributo corePoolSize que determina cuántos subprocesos comenzará hasta que los nuevos subprocesos solo se inicien cuando la cola esté llena
MaximumPoolSize : este atributo determina cuántos subprocesos se inician como máximo. Puede establecer esto en Integer. MAX_VALUE para no tener un límite superior
fuente
java.util.concurrent.ThreadPoolExecutor
fuente
Comprender el comportamiento interno de
ThreadPoolExecutor
cuando se envía una nueva tarea me ayudó a comprender cómocorePoolSize
ymaximumPoolSize
diferenciar.Dejar:
N
el número de procesos en la piscina,getPoolSize()
. Subprocesos activos + subprocesos inactivos.T
ser la cantidad de tareas enviadas al ejecutor / grupo.C
ser el tamaño del núcleo de la piscina,getCorePoolSize()
. Cuántos subprocesos se pueden crear como máximo por grupo para las tareas entrantes antes de que las nuevas tareas pasen a la cola .M
el tamaño máximo de la agrupación,getMaximumPoolSize()
. Cantidad máxima de subprocesos que puede asignar el grupo.Comportamientos de
ThreadPoolExecutor
en Java cuando se envía una nueva tarea:N <= C
, a los subprocesos inactivos no se les asigna la nueva tarea entrante, sino que se crea un nuevo subproceso.N > C
y si hay subprocesos inactivos, entonces se asigna una nueva tarea allí.N > C
y si NO hay subprocesos inactivos, las nuevas tareas se colocan en la cola. AQUÍ NO SE CREÓ UN HILO NUEVO.M
. SiM
se alcanza, rechazamos las tareas. ¡Lo que es importante no aquí es que no creamos nuevos hilos hasta que la cola esté llena!Fuentes:
Ejemplos
Ejemplo con
corePoolSize = 0
ymaximumPoolSize = 10
con una capacidad de cola de50
.Esto dará como resultado un único hilo activo en el grupo hasta que la cola tenga 50 elementos.
Ejemplo con
corePoolSize = 10
ymaximumPoolSize = 10
con una capacidad de cola de50
.Esto dará como resultado 10 subprocesos activos en el grupo. Cuando la cola tiene 50 elementos, las tareas se rechazarán.
fuente