2012-04-04 2 views
2

Je reproduis 20 threads (ils sont tous censés fonctionner en même temps). Cependant, ils sont tous créés en même temps et tous commencent à s'exécuter en même temps, ce qui donne à l'ensemble du programme un décalage majeur (c'est un décalage, mon ordinateur n'est pas lent). Donc, je veux les faire créer à différents moments, par exemple. générer un toutes les 2 secondes ou plus. Comment puis-je faire cela? J'ai essayé d'utiliser une tonne de choses, mais rien ne fonctionne comme je le veux. J'ai essayé d'utiliser des méthodes booléennes pour ne pas boucler à nouveau jusqu'à ce que ce soit vrai, mais cela ne semble pas fonctionner. Des idées?Comment ralentir la génération de Threads en java?

for (int i = 0; i < 20; i++) { 
    Rain r = new Rain(); 
    r.start(); 
} 
+3

Je peux créer des milliers de threads sur mon Macbook Pro en une seconde. Pouvez-vous expliquer un peu plus ce que vous entendez par retard et pourquoi pensez-vous que la création de threads est en cause? – Gray

+1

êtes-vous en train de jouer avec les priorités de threads ou en utilisant beaucoup de mémoire dans les threads eux-mêmes? 20 threads ne devraient poser aucun problème, sauf si vous avez beaucoup de conflits entre les threads ... –

+1

20 threads, ou 150 threads, prend un temps imperceptible. S'il se passe quelque chose d'autre dans le thread ctor qui provoque un retard accru, alors une solution raisonnable pour 'lag' est de créer un thread de faible priorité qui crée ensuite les 20/150 autres threads avec une faible priorité. Je n'ai jamais vu aucun besoin de Sleep (2000), dans une boucle de construction de fil, jamais. –

Répondre

4

Essayez d'exécuter le générateur de fil comme un fil, puis mettre en œuvre un Thread.sleep (2000)

+0

merci, je vais essayer – jackcogdill

+0

J'ajouterais 0,5 point si je pouvais. L'utilisation d'un thread de générateur, de préférence de faible priorité, qui crée des threads de faible priorité 20/150 est une bonne idée. Le sommeil() n'est tout simplement pas. –

+0

Avoir un point de toute façon :) –

1

Je ne vois vraiment pas pourquoi il sera décalé pour seulement 20 fils créant mais vous pouvez mettre un dormir si vous voulez qu'ils soient commencé à différents moments:

for (int i = 0; i < 20; i++) { 
    Rain r = new Rain(); 
    r.start(); 
    Thread.sleep(2000); 
} 
+0

ok, ça marche totalement maintenant merci! (btw, c'était comme 150 fils) – jackcogdill

3

vous pouvez probablement créer un fil génitrice, qui peut accueillir seulement 2 secondes entre chaque ponte fil:

for (int i = 0; i < 20; i++) { 
    Rain r = new Rain(); 
    r.start(); 
    Thread.sleep(2000); 
} 

Note: gauche des blocs try-catch

+0

Ne pas encourager ce sommeil! –

+0

@MartinJames Pourquoi ne pas utiliser le sommeil ici?La mauvaise réputation de la méthode du sommeil est principalement due à l'abus de celle-ci. Voir cette question: http://stackoverflow.com/questions/3956512/java-performance-issue-with-thread-sleep –

2

Si vous rencontrez le décalage en raison du nombre de threads que vous créez, la meilleure solution est sans doute de réduire le nombre de threads que vous créez. Java 5 a également introduit le framework de service d'exécution, qui a été amélioré à nouveau dans Java 7 avec fork/jointures, donc vous ne devriez pas avoir à créer des threads vous même dans des circonstances normales. (Here est un lien vers une page avec une assez bonne explication de ces concepts.)

Je ne généralement pas commencer plus de fils que moi noyaux sur la machine, comme ceci:

int availableThreads = Runtime.getRuntime().availableProcessors(); 
ExecutorService executorService = Executors.newFixedThreadPool(availableThreads); 

// ...Create List<Future<ReturnObject>> 
// populate list by calling futures.add(executorService.submit(callable)); 

executorService.shutdown(); 

C'est car, tant que le processus est intensif en calcul, vos plus gros gains de thread sont réalisés lorsque vous avez un calcul simultané sur chaque cœur au lieu d'un thread tournant sur un seul cœur. Bien sûr, cela change lorsque vous parlez d'un processus qui nécessite beaucoup de disque ou de réseau, mais c'est une bonne règle générale.