multithread - Java - Programmation
Marsh Posté le 16-01-2004 à 16:31:59
Il faut que tu gères une classe qui va compter pour toi,
Cette classe contiendra un compteur static
Chaque Thread devra décrémenter le compteur de cette classe de comptage en se fermant
ça s'appelle singleton il me semble comme modèle de conception...
Marsh Posté le 16-01-2004 à 16:35:44
Citation : Chaque Thread devra décrémenter le compteur de cette classe de comptage en se fermant |
C'est bien là que le bât blaisse...
Je crois qu'il va falloir que je force les pti gars qui développent les trt à envoyer un signal à la fin de leur méthode run().
Marsh Posté le 16-01-2004 à 16:38:46
oui, il faut qu'à la fin du run() des tâches, ils signalent la fin de la tâche, ça peut passer par un encapsulage du run() de ta tache ou du Runnable.
typiquement quelquepart tu auras ça :
Code :
|
Donne un peu plus de détails : quelle est cette interface ? tu utilises des Runnable ou des Thread ?
Pour qu'on puisse te donner une réponse plus précise.
dernier détail au cas où : n'oublie pas que le seul moyen valable de tuer une tache est de terminer la méthode run(), toutes les autres sont risquées et vont être supprimées de java.
Marsh Posté le 16-01-2004 à 16:45:44
Dans la java doc, y'a une methode de la class Thread qui s'appelle "isAlive()":
Code :
|
Je pense que ça doit être ça!
Marsh Posté le 16-01-2004 à 16:48:20
Donc quand tu garde en mémoire un vecteur de tes threads lancés. Et quand tu veux en lancer un nouveau, si ton compteur est est au max, tu parcours ton vecteur pour voir si par hasard, y'en aurait pas un qui serait terminé!
Marsh Posté le 16-01-2004 à 16:50:52
houlà, on est pas sur la même planète niveau complexité.
Marsh Posté le 16-01-2004 à 16:51:22
isAlive()... comment j'ai pu passer à côté !?
Oui, je peux me servir de ça : connstruire une List de mes threads et la parcourir de temps en temps, appeler isAlive et si true => je décrémente.
Merci.
Comme dirait JCD : "je crois que c'est mes yeux"
Marsh Posté le 16-01-2004 à 16:52:00
ReplyMarsh Posté le 16-01-2004 à 16:54:45
krosso a écrit : |
avec la bidouille isAlive, tu parcoures un tableau, avec la mienne, tu décrémentes un compteurs au bon moment.
En plus avec ton tableau tu vas garder des références sur les threads, donc limiter le GC. N'oublie pas au moins de mettre la case du tableau à null quand tu verras qu'une thread est morte.
Marsh Posté le 16-01-2004 à 16:58:27
L'intérêt du isAlive() c'est que je ne dois pas intervenir dans le code des trts.
Tout ce que je connais de ces trts c'est leur interface et ses méthodes call() et run()
je n'ai aucun contrôle sur ce que les développeurs vont mettre dans leur méthodes run().
Il y a bien une spec que je vais distribuer.
Mais même s'il est écrit n/b dans ma spec qu'il faut envoyer tel message à la fin de run(), tu peut être sûr qu'un gusse ne le fera pas et va me pourir mon compteur de threads... trop risqué.
Marsh Posté le 16-01-2004 à 17:00:17
krosso a écrit : L'intérêt du isAlive() c'est que je ne dois pas intervenir dans le code des trts. |
Je t'ai dit de nous donner au moins l'interface pour te montrer comment faire le proxy qui va bien.
Marsh Posté le 16-01-2004 à 17:06:18
nraynaud a écrit : Je t'ai dit de nous donner au moins l'interface pour te montrer comment faire le proxy qui va bien. |
Merci pour ton aide, mais la solution isAlive() me convient. Du moins vais-je la tester.
pour l'interface :
public interface IBatch extends Runnable
{
public void call(Classe1 truc, Classe2 truc);
}
Marsh Posté le 16-01-2004 à 17:07:53
1) Récupérer un pool de thread dont tu fixes la taille max
2) faire un petit truc vite fait à la mimine :
Code :
|
ca devrait marcher ...
edit : j'ai mit tant de temps que ca à l'écrire ce code ??? y avait pas de réponse quand j'ai commencé
edit2 : au moins 35 minutes
Marsh Posté le 16-01-2004 à 17:16:22
Diantre Benou, Je te remercie de te donner autant de mal !
Je te promets de regarder ça en détails.
Présentement je pars en week-end (bien mérité ma foi).
Marsh Posté le 16-01-2004 à 17:17:48
benou > quand je fais un pool, je mets une pile qui ne contient que des objets libres. ça permet d'avoir tout en O(1).
edit : et accessoirement de réutiliser en priorité l'objet le plus récement utilisé.
Marsh Posté le 16-01-2004 à 17:18:44
krosso a écrit : Diantre Benou, Je te remercie de te donner autant de mal ! |
ca faisait un moment que ca me démangeait de coder ca
quand j'aurais du courage je ferai la version qui augmente son pool de thread dynamiquement
Marsh Posté le 16-01-2004 à 17:23:06
nraynaud a écrit : benou > quand je fais un pool, je mets une pile qui ne contient que des objets libres. ça permet d'avoir tout en O(1). |
ouais je sais, je me suis pas fait chier, j'ai fait des boucles sur le tableau ... ce serait mieux avec une pile bien sûr (quoique l'implémentation Stack du JDK sux méchament)
Marsh Posté le 16-01-2004 à 17:27:56
benou a écrit : |
j'ai même pas regardé, j'ai vu que c'était synchronized par défaut => on prend.
mais sinon, y'a ArrayList et LinkedList.
edit : mais c'est surtout que le code est plus court avec une pile.
C'est marrant cette tendance à avoir une complexité de daube et un code plus long quand "on veut pas se faire chier", des fois ça me fait pareil.
Marsh Posté le 16-01-2004 à 19:01:00
nraynaud a écrit : j'ai même pas regardé, j'ai vu que c'était synchronized par défaut => on prend. |
ben ca hérite de Vector
nraynaud a écrit : |
ben nan c'est pas beaucoup plus court :
Code :
|
Marsh Posté le 16-01-2004 à 19:04:04
ReplyMarsh Posté le 16-01-2004 à 19:09:55
benou
Marsh Posté le 16-01-2004 à 19:10:37
Voir aussi du coté des ThreadsGroup. Comme son nom l'indique, permet de faire des groupes de threads. Ensuite, il existe une fonction nommé "activeCount()" qui renvoie le nb de Thread qui tourne dans le groupe. Bref... A voir, quoi!
Marsh Posté le 16-01-2004 à 19:12:56
torpe23 a écrit : Voir aussi du coté des ThreadsGroup. |
je me suis jamais servi de ce machin là
Marsh Posté le 16-01-2004 à 19:13:09
ReplyMarsh Posté le 16-01-2004 à 19:13:51
moi non plus, mais ça a l'air d'être la solution pourtant!
Pkoi refaire ce que d'autre ont déja fait?!
Marsh Posté le 16-01-2004 à 19:16:22
torpe23 a écrit : Pkoi refaire ce que d'autre ont déja fait?! |
heu non, le threadgroup n'a rien à voir avec un pool de thread ...
Marsh Posté le 16-01-2004 à 19:22:18
torpe23 a écrit : pkoi pas? |
ben c'est pas les mêmes fonctionnalités, c'est tout
Le pool de thread répond bien mieux à ton besoin. En plus, il t'évite de relancer un nouveau thread à chaque traitement : il utilise tjs les mêmes
Marsh Posté le 16-01-2004 à 19:25:12
benou > on était pas sur la même longueur d'onde.
Bon ça devient jacky-threadpool, donc je vais étudier la solution qui m'est venue à l'esprit. Mais on est clairement sorti du "vite fait", d'un autre côté, ça peut me servir dans peu de temps.
Marsh Posté le 16-01-2004 à 19:30:52
Harkonnen a écrit :
|
c'est vrai qu'il est sacrement balaise benou meilleur que moins moins en tout cas
Marsh Posté le 16-01-2004 à 19:31:12
benou a écrit : |
et tu t'étonnes que je te raille quand on te prend pour un génie
Marsh Posté le 16-01-2004 à 19:31:26
nraynaud a écrit : benou > on était pas sur la même longueur d'onde. |
ha
je vois pas ce que tu voulais dire avec la pile alors ...
Marsh Posté le 16-01-2004 à 19:32:10
the real moins moins a écrit : et tu t'étonnes que je te raille quand on te prend pour un génie |
pardon maître
Marsh Posté le 16-01-2004 à 19:33:09
je vais faire un truc et tu me diras ce que tu en penses, j'ai encore quasiment rien fait avec les threads en java pour l'instant.
Marsh Posté le 16-01-2004 à 19:37:37
nraynaud a écrit : je vais faire un truc et tu me diras ce que tu en penses |
ca roule
Marsh Posté le 16-01-2004 à 20:16:25
En fait non, laisse béton, je ferais pas mieux.
peut-être en remettant un close dans le finalize et en virant le catch universel (j'ai horreur de ça, ça fout les debuggeurs en vrac), mais sinon rien.
Marsh Posté le 16-01-2004 à 20:31:09
nraynaud a écrit : |
ouais ...
nraynaud a écrit : et en virant le catch universel (j'ai horreur de ça, ça fout les debuggeurs en vrac), mais sinon rien. |
ca non, faut pas ! Si tu fais ca tu flingues tes threads au fur et à mesure !
Qu'est ce que tu voudrais mettre à la place ? De toute façon à ce niveau là tu ne peux rien faire d'autre que de stacktracer l'erreur ... C'est ce que ferais un vrai thread avant de se laisser mourrir là je sauve juste mon thread
et c'est quoi le problème avec les débuggueur
Marsh Posté le 16-01-2004 à 20:47:07
benou a écrit : |
tu laisses mourrir ton thread et tu en recrées un autre ? (dans le catch tu recrées le nouveau thread, tu règles tout au niveau du pool et tu relances l'exception).
Les debuggeurs s'arrêtent au point de départ de l'exception et ça permet de debugger. Sinon c'est comme swing : la merde à debugger (à coup de breakpoints dans Throwable()). Car si on bouffe l'exception, on n'a qu'une trace dans la sortie standard, un peu mince comme indice du problème.
Aussi j'aurais fait une création lazy (au besoin) des threads.
Et puis mettre un close() finalize c'est une connerie, à cause du pointeur vers l'objet englobant.
Marsh Posté le 16-01-2004 à 21:38:13
nraynaud a écrit : tu laisses mourrir ton thread et tu en recrées un autre ? (dans le catch tu recrées le nouveau thread, tu règles tout au niveau du pool et tu relances l'exception). |
et c'est quoi l'intérêt ?????
nraynaud a écrit : |
??? mais ca reviendrait exactement au même que je laisse passer l'exception ... je comprend pas ce que tu veux dire ... En quoi le debuggueur se comporterait différement ?
si le mec veut intercepter les erreur, il peut le faire au niveau du traitement ... Quand n runnable plante, si tu laisse passer l'exception à traers le run, tu n'as plus aucun contrôle ... Donc je vois pas en quoi c'est gênent que moi je la catche après
nraynaud a écrit : |
ouais, c'est ce que je disais quand je parlais d'une dynamisation du pool de thread. En même temps là, tu gagne en perf : les threads sont créés à l'initialisation => le pool est plus réactif ... Tu penses que ca vouffe bcp de ressource un thread en pause ?
nraynaud a écrit : |
?? hein ?
c'est dans le finalize du pool qu'il faut mettre le close, pas dans les Pooled Thread.
Marsh Posté le 16-01-2004 à 15:37:32
Un serveur doit lancer des traitements (trt) qui sont des threads.
Les trt en question implémentent une interface qui permet de les manipuler mais on ne connait pas du tout ces trt, ce qu'ils font etc... (De plus les classes de ces trt sont chargées dynamiquement).
Je veux limiter les nombre de threads que le serveur doit lancer.
A chaque fois que je lance un trt, je regarde si runningThreads<=maxThreads, j'incrémente runningThreads et je lance le trt.
Problème : n'ayant aucun contrôle sur ces trts, je ne sais pas quand ils s'arrêtent et donc quand je peux décrémenter mon compteur de threads.
Je n'ai pas la main sur le code des trt...
Une idée ?