2012-11-20 5 views
6

Comment limiter le nombre de threads exécutés en même temps? est Voici un exemple de mon algorithme:Limiter le nombre de threads dans Groovy

for(i = 0; i < 100000; i++) { 
    Thread.start { 
     // Do some work 
    } 
} 

Je voudrais vous assurer que, une fois nombre de threads dans mon application frappe 100, l'algorithme se met en pause/attendre jusqu'à ce que nombre de threads dans l'application va au-dessous 100.

Actuellement "un peu de travail" prend du temps et je me retrouve avec quelques milliers de threads dans mon application. Finalement, il n'y a plus de threads et "quelques travaux" se bloque. Je voudrais le réparer en limitant le nombre de piscines qu'il peut utiliser en même temps.

S'il vous plaît laissez-moi savoir comment résoudre mon problème.

Répondre

10

Je crois que vous recherchez un ThreadPoolExecutor dans l'API Java Concurrency. L'idée ici est que vous pouvez définir un nombre maximum de threads dans un pool, puis au lieu de démarrer de nouveaux Threads avec un Runnable, laissez simplement le ThreadPoolExecutor s'occuper de la gestion de la limite supérieure pour Threads.

Commencez ici: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

import java.util.concurrent.*; 
import java.util.*; 

def queue = new ArrayBlockingQueue<Runnable>(50000) 
def tPool = new ThreadPoolExecutor(5, 500, 20, TimeUnit.SECONDS, queue); 

for(i = 0; i < 5000; i++) { 
    tPool.execute { 
     println "Blah" 
    } 
} 

Paramètres pour le constructeur ThreadBlockingQueue: corePoolSize (5), c'est le nombre de threads pour créer et maintenir si le système est inactif, maxPoolSize (500) nombre maximum de threads pour créer, 3ème et Le quatrième argument indique que le pool doit conserver les threads inactifs pendant au moins 20 secondes et que l'argument de file d'attente est une file d'attente de blocage qui stocke les tâches en file d'attente.

Ce que vous voudrez jouer avec est la taille des files d'attente et aussi comment gérer les tâches rejetées. Si vous devez exécuter des tâches de 100 Ko, vous devez avoir une file d'attente pouvant contenir 100 000 tâches, ou vous devez avoir une stratégie pour gérer les tâches rejetées.

+0

Est-il possible d'obtenir un petit exemple? – MeIr

+0

@Melr - J'ai ajouté un exemple, voilà. –

+0

Assez étrange mais ci-dessus exemple ne se comporte pas comme prévu dans Grails :(Merci pour une réponse, je pense que je pourrais avoir à poser une autre question, spécifique à l'environnement Grails – MeIr

Questions connexes