2011-04-12 4 views
5

J'ai principalement une utilisation intensive du processeur qui s'exécute sur un pool de threads. L'opération a cependant un certain nombre d'événements externes d'attente qui ne se produisent pas uniformément dans le temps. Comme en Java, pour autant que je sache, il n'existe pas d'implémentation de pool de threads qui dimensionne automatiquement le nombre de threads en fonction du débit de la tâche observée (comme dans CLR 4 de Microsoft). augmenter sa taille quand une opération de blocage commence et diminuer quand elle se termine?Surinscription de pool de threads Java

Par exemple avec 8 cœurs, la taille du pool est 8. Si le fonctionnement est lié à 100% CPU, utilisez simplement ce pool fixe. S'il y a une opération de blocage, on devrait pouvoir le faire:

pool.increase(); 
waitForSpecialKeyPress(); 
pool.decrease(); 

Voici comment cela se fait dans la bibliothèque de Microsoft C++ Async: Use Oversubscription to Offset Latency

Répondre

3

Le module ForkJoinPool de Java 7 a un ManagedBlocker, qui peut être utilisé pour informer le pool des threads bloqués, afin qu'il puisse programmer davantage de threads si nécessaire.

EDIT: J'ai oublié de mentionner, les classes sont également disponibles pour Java 6 en tant que jsr166y.

4

Vous pouvez étendre ThreadPoolExecutor d'ajouter votre propre increase() et decrease() fonctions, qui font simple setMaximumPoolSize(getMaximumPoolSize() +/- 1). Assurez-vous de synchroniser les méthodes pour vous assurer de ne pas gâcher la taille du pool par accident.

Questions connexes