web-dev-qa-db-fra.com

Comment Keep-Alive fonctionne-t-il avec ThreadPoolExecutor?

Dans le prolongement d'une question postée par moi, j'essaie d'utiliser ThreadPoolExecutor dans ma base de code. Même après des tentatives répétées de compréhension à partir de la documentation relative à l'API Java, je n'ai pas compris clairement la fonctionnalité/l'objet du paramètre keepAliveTime à transmettre dans le constructeur. J'espère que quelqu'un pourra m'expliquer avec un bon exemple de travail.

Extraits du document Java:

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

keepAliveTime - lorsque le nombre de threads est supérieur au noyau, il s'agit du temps maximal pendant lequel les threads inactifs en attente attendent de nouvelles tâches avant de se terminer.

38
Gnanam

Supposons que vous avez une taille de cœur de 5 et une taille maximale de 15. Pour une raison quelconque, votre pool est occupé et utilise les 15 unités d'exécution disponibles. Vous finissez par manquer de travail - de sorte que certains de vos threads deviennent inactifs à la fin de leur tâche finale. Donc, 10 de ces discussions sont autorisés à mourir.

Cependant, pour éviter qu'ils ne soient tués trop rapidement, vous pouvez spécifier l'heure de maintien en vie. Ainsi, si vous spécifiez 1 en tant que valeur keepAliveTime et TimeUnit.MINUTE en tant que valeur unit, chaque thread attendra une minute après avoir terminé l'exécution d'une tâche pour voir s'il reste du travail à faire. S'il ne disposait toujours pas de travail supplémentaire, il se laisserait compléter jusqu'à ce qu'il ne reste plus que 5 threads dans le pool, le "noyau" du pool.

60
Jon Skeet

Voici un peu plus de description de la 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>
 *

Cela vous permet essentiellement de contrôler le nombre de threads restant dans le pool inactif. Si vous faites cela trop petit (pour ce que vous faites), vous créerez trop de threads. Si vous le rendez trop volumineux, vous utiliserez de la mémoire/des threads inutiles.

3
Francis Upton

Voici un exemple de code illustrant le travail de keepAliveTimeComment fonctionne maximumPoolSize de ThreadPoolExecutor?

0
Dmitry Krivenko