2010-04-21 4 views
0

Je dois créer un programme avec un nombre limité de threads (actuellement en utilisant newFixedThreadPool) mais j'ai le problème que tous les threads soient créés dès le début, en remplissant la mémoire à un rythme alarmant.Fonctionnalité de pool de threads Java

Je souhaite éviter cela. Les threads ne doivent être créés que peu de temps avant leur exécution. Par exemple: J'appelle le programme et lui demande d'utiliser 2 threads dans le pool. Le programme doit créer & lancer immédiatement les 2 premiers threads (évidemment), créer les 2 suivants pour attendre les 2 précédents, et attendre jusqu'à ce que l'un ou l'autre des deux premiers se termine. J'ai pensé à étendre l'exécuteur ou FixedThreadPool ou tel. Cependant, je n'ai aucune idée sur la façon de commencer là et douter que c'est la meilleure solution. Le plus facile aurait mon fils principal dormant sur des intervalles, qui n'est pas vraiment bon non plus ...

Merci d'avance!

Répondre

2

En regardant les détails dans votre message ...

J'appelle le programme et à utiliser instruis 2 fils dans la piscine. Le programme devrait créer & lancer immédiatement les 2 premiers threads (évidemment), créer les 2 suivants pour attendre les 2 précédents, et à ce stade, attendez jusqu'à ce que l'un des deux premiers ou les deux se soient terminés.

Votre problème concerne beaucoup plus la synchronisation de l'exécution des tâches que le regroupement des tâches. De ce que vous dites ici, vous voulez avoir 2 threads l'exécution de n'importe quel nombre de tâches; Si vous ne voulez pas que 100 tâches s'exécutent en même temps, ne créez pas un pool de 100 threads ...

Je suggérerais soit d'utiliser un BlockingQueue pour contrôler vos Runnables, ou créer un pool de 2 threads en utilisant un ThreadPoolExecutor, et le nourrir toutes vos tâches. Il va les exécuter quand les threads sont disponibles.

Cela a-t-il un sens avec ce que vous essayez d'accomplir ici?

+0

Cela a plus de sens. Mais grâce à votre réponse, j'ai abordé la méthode producteur/consommateur, ce qui est exactement ce dont j'ai besoin: 1 producteur lisant le fichier, et x (à définir) les consommateurs. Merci :) – cpf

+0

Super, heureux ça a aidé ;-) – Etienne

3

Avez-vous essayé de regarder ThreadPoolExecutor? En utilisant les bons paramètres de constructeur, vous pouvez facilement modifier le nombre et le temps de maintien en vie des threads créés.

+0

Oui, et pour lui, il a besoin de mettre le numéro de core-thread à 0. – gimpf

+0

Je ne vois pas comment cela change la situation en fait ... Dans mon fil principal je lis d'un fichier, et selon à un certain contenu dans la ligne que je lis, je crée un fil et l'ajoute à l'exécuteur. Dans ce constructeur, j'ajoute les lignes de lecture, donc l'objet les a. Dans le résultat, je suis en train de bourrer le fichier en mémoire, mais les fichiers plus volumineux se traduiront par une énorme baisse des performances et/ou une mémoire insuffisante ... – cpf

0

Je ne pense pas que vous devriez manipuler l'implémentation du pool de threads. Si vous créez les threads peu de temps avant l'exécution, vous perdez le principal avantage du pool, qui recycle vos threads. Peut-être que vous devriez réduire le nombre maximum de threads dans le pool. Si vous demandez au pool de créer un trop grand nombre d'entre eux, la mémoire totale hors segment utilisée pour leurs espaces de pile consommera toute la mémoire disponible. Je suppose que c'est le type d'OutOfMemoryError que vous avez (?).

+0

Je n'ai pas encore eu l'erreur. Mais je prédis que ça va. À un moment donné, le programme devrait fonctionner avec des jeux de données de plus en plus volumineux et je doute que la mémoire de la machine soit toujours capable de tout contenir. – cpf

0

Si vous regardez cela d'un point de vue performance, alors il est préférable de prendre le hit en mémoire lors du premier démarrage de l'application plutôt que d'être constamment bombardé d'allocation et de désallocation de mémoire pendant l'exécution du programme.

Si vous utilisez trop de mémoire lorsque vous démarrez l'application, la mémoire sera encore trop importante par la suite. Vous devriez réduire la taille du pool de threads.

L'utilisation d'un pool de threads présente des avantages supplémentaires. En effet, si vous perdez un thread, le pool de threads en crée automatiquement un nouveau pour le remplacer, ce qui maintient votre pool de threads à une taille constante.

Si ce n'est pas le type d'avantage que vous recherchez, vous pouvez gérer les threads en mémoire manuellement et éviter le pool de threads.

+0

Je suppose que je vais donner un coup de feu à mon propre traitement. Bien que cela ressemble à beaucoup de travail en gardant une trace du nombre de threads et tout. En outre, il faut encore des moments de sommeil pour attendre la fin des discussions. Est-il possible d'attendre plusieurs threads sans ThreadPool? – cpf

Questions connexes