2012-04-30 26 views
33

En la continuación de un question publicado por mí, estoy tratando de usar 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 que se pasará en el constructor. Espero que alguien me explique con un buen ejemplo de trabajo.¿Cómo funciona Keep-alive con ThreadPoolExecutor?

Extractos de Java doc:

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

keepAliveTime - cuando el número de hilos es mayor que el núcleo, este es el tiempo máximo que el exceso de hebras en espera esperarán a nuevas tareas antes de terminar.

+2

Del mismo modo que un punto de la terminología, que ha utilizado dos veces la palabra "aplicar" cuando pienso que acaba de decir "utilización". No estás tratando de * implementar * 'ThreadPoolExecutor' escribiendo tu propio código implementando esa API; solo estás creando un' ThreadPoolExecutor' y quieres saber cómo se comportará, ¿no? –

+0

Sí, tienes razón. Solía ​​decir que es un nuevo tipo de implementación en mi base de código. – Gnanam

+0

Pero no es una implementación * de * 'ThreadPoolExecutor'. Es realmente útil si puede utilizar la terminología de manera apropiada, * particularmente * en Stack Overflow. –

Respuesta

47

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 utiliza 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 permanencia activa. Por lo tanto, si especificaba 1 como el valor keepAliveTime y TimeUnit.MINUTE como el valor unit, cada subproceso esperaría un minuto después de haber terminado la ejecución de 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.

+2

Si entendí esto correctamente, 'keepAliveTime' se usa/es efectivo" solo "cuando los hilos del grupo tienen más que el tamaño del núcleo. Esto * no * es aplicable cuando los hilos en el conjunto están por debajo del tamaño del núcleo. – Gnanam

+0

Lo siento, si esta pregunta es demasiado básica. Pero, ¿por qué queremos mantener los hilos vivos que realmente han terminado de ejecutar una tarea? De todos modos, el número máximo de hilos ('maximumPoolSize') permitido en el grupo es limitado ¿no? – Gnanam

+2

El punto de matar a los hilos es el mismo que tener un conjunto de hilos en primer lugar, sin desperdiciar recursos innecesarios. –

3

Aquí hay más descripción desde el 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 sólo le permite controlar el número de hilos que quedan en la piscina de inactividad. 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.

Cuestiones relacionadas