thread español java multithreading keep-alive

español - thread pool java



¿Cómo funciona Keep-alive con ThreadPoolExecutor? (3)

Como continuación a una question que ThreadPoolExecutor intento utilizar ThreadPoolExecutor en mi código base. Incluso después de repetidos intentos de comprensión del documento de la API de Java, no pude entender claramente la funcionalidad / propósito detrás del parámetro keepAliveTime para pasar en el constructor. Espero que alguien me explique con un buen ejemplo de trabajo.

Extractos del documento de Java:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)

keepAliveTime : cuando el número de subprocesos es mayor que el núcleo, este es el tiempo máximo que el exceso de subprocesos inactivos esperará nuevas tareas antes de finalizar.



Aquí hay una descripción más de Javadoc:

<dt>Keep-alive times</dt> * * <dd>If the pool currently has more than corePoolSize threads, * excess threads will be terminated if they have been idle for more * than the keepAliveTime (see {@link * ThreadPoolExecutor#getKeepAliveTime}). This provides a means of * reducing resource consumption when the pool is not being actively * used. If the pool becomes more active later, new threads will be * constructed. This parameter can also be changed dynamically * using method {@link ThreadPoolExecutor#setKeepAliveTime}. Using * a value of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS} * effectively disables idle threads from ever terminating prior * to shut down. * </dd> *

Esencialmente, esto solo le permite controlar la cantidad de subprocesos que quedan en el grupo inactivo. Si lo hace demasiado pequeño (para lo que está haciendo), creará demasiados hilos. Si lo hace demasiado grande, consumirá memoria / hilos que no necesita.


Supongamos que tiene un tamaño de núcleo de 5 y un tamaño máximo de 15. Por alguna razón, su grupo se ocupa y usa los 15 hilos disponibles. Finalmente, se queda sin trabajo, por lo que algunos de sus subprocesos quedan inactivos cuando finalizan su tarea final. Entonces 10 de esos hilos pueden morir.

Sin embargo, para evitar que se eliminen demasiado rápido, puede especificar el tiempo de mantener vivo. Por lo tanto, si especificas 1 como el valor keepAliveTime y TimeUnit.MINUTE como el valor unit , cada hilo esperaría un minuto después de haber terminado de ejecutar una tarea para ver si había más trabajo por hacer. Si aún no se le hubiera dado más trabajo, se dejaría completar, hasta que solo hubiera 5 subprocesos en el grupo, el "núcleo" del grupo.