threadpooltaskexecutor thread taskexecutor example ejemplo async spring multithreading

taskexecutor - spring thread pool



Cuál es la diferencia entre corePoolSize y maxPoolSize en Spring ThreadPoolTaskExecutor (4)

Aquí están las reglas de Sun para la creación de subprocesos en términos simples:

  1. Si el número de subprocesos es menor que corePoolSize , cree un nuevo subproceso para ejecutar una nueva tarea.
  2. Si el número de subprocesos es igual (o mayor) al corePoolSize , coloque la tarea en la cola.
  3. Si la cola está llena y el número de subprocesos es menor que maxPoolSize , cree un nuevo subproceso para ejecutar tareas.
  4. Si la cola está llena y el número de subprocesos es mayor o igual que maxPoolSize , rechace la tarea.

Articulo completo

Respuesta de origen

Tengo que enviar massEmails a todos los usuarios de un sitio web. Quiero usar un grupo de subprocesos para cada correo electrónico que se envía. Actualmente he establecido los valores a:

<property name="corePoolSize" value="500" /> <property name="maxPoolSize" value="1000" />

¿Cuál es la diferencia entre los dos y va a escalar? Actualmente tengo aprox. 10000 usuarios.


Debe considerar aumentar el valor de queueCapacity que considerar aumentar el valor de corePoolSize o maxPoolSize . Esas dos propiedades (* PoolSize) son el número de grupo a ejecutar, pero cada mensaje se consideraría en queueCapacity

<property name="corePoolSize" value="5" /> <property name="maxPoolSize" value="10" /> <property name="queueCapacity" value="1000" /> <property name="waitForTasksToCompleteOnShutdown" value="true"/>

Si tiene 10000 usuarios para enviar, entonces 1000 * 10 (maxPoolSize) = 10000, pero si 1000 para cada hilo es pesado, podemos considerar aumentar poolSize.


El javadoc lo dice mejor :

Cuando se envía una nueva tarea [...] y se están ejecutando menos subprocesos corePoolSize , se crea un nuevo subproceso para gestionar la solicitud, incluso si otros subprocesos de trabajo están inactivos. Si hay más de corePoolSize pero menos de maximumPoolSize subprocesos maximumPoolSize ejecución, solo se creará un nuevo subproceso si la cola está llena. Al establecer corePoolSize y maximumPoolSize la misma manera, crea un grupo de subprocesos de tamaño fijo. Al establecer maximumPoolSize en un valor esencialmente ilimitado como Integer.MAX_VALUE , permite que el grupo acomode un número arbitrario de tareas concurrentes.

En cuanto a su situación específica, enviar 500 correos electrónicos al mismo tiempo no tiene sentido, simplemente abrumará al servidor de correo. Si necesita enviar una gran cantidad de correos electrónicos, utilice un único hilo y envíelos por el conducto de uno en uno. El servidor de correo manejará esto mucho más elegantemente que 500 conexiones separadas.


corePoolSize es la cantidad mínima de subprocesos utilizados por el grupo. El número puede aumentar hasta maxPoolSize . Cuando la carga baja, el grupo se reducirá a corePoolSize .

El envío de correos electrónicos parece ser una operación de E / S encuadernada. No creo que tener 500 hilos lo haga más rápido.