Multithreading et gestion des exceptions [Java] - Java - Programmation
Marsh Posté le 25-07-2004 à 00:20:55
- y'a des handlers d'exception au niveau groupe de threads (et tout thread appartient par défaut au même groupe que son créateur, ce qui permet au passage de mettre un handler au thread de répartition des évènements swing, l'élite mondiale du java le sait bien).
- un catchall dans le run() (qui peut par exemple enfiler un évènement représentant l'erreur dans une file destinée au parent).
Marsh Posté le 25-07-2004 à 00:33:09
Je vais commencer par lire la doc de ThreadGroup.
Par contre, la file dont tu parles dans le deuxième cas, tu la ferais comment ? Une pile, avec un listener qui scrute son contenu ?
EDIT : je sens que je vais m'amuser à synchroniser mes merdes.
Marsh Posté le 25-07-2004 à 00:41:35
perso, l'implémentation la plus simple des files de messages est que je conaisse une LinkedList avec un wrapper synchronized.
tu pousses avec addLast() tu tires avec removeFirst().
bien entendu, c'est plus compliqué si le consomateur doit être réveillé au poussage (qu'il est pas en polling), mais des histoires de producteurs/consomateurs, y'en a plein les cours d'algo.
Marsh Posté le 25-07-2004 à 01:15:06
Je programme une petite appli perso pour gérer les constituants d'un réseau.
J'utilise le stack SNMP de Westhawk et je tente de l'intégrer dans un module "collecte des informations".
Parmi les infos que je récupère, il y a par exemple, dans le cas d'un PC, l'utilisation mémoire de chaque processus soumis à l'OS.
Ce que j'ai fait :
Mon Main lance une tâche périodique de récupération de la mémoire utilisée. Celle-ci repose sur java.util.TimerTask et permet de lancer le processus de collecte sur un objet dédié au parcours de tables administrables par SNMP (la mémoire figure dans une table). J'ai appelé cet objet un TableDataRetriever.
Le TDR est susceptible de lancer une exception lorsque la création du contexte SNMP échoue et lorsque l'envoi d'un paquet échoue.
De mon point de vue, ces problèmes doivent déclencher la destruction du contexte (peu ou prou une Socket), et l'annulation de la tâche périodique ou du timer.
Voilà. Tout commentaire (surtout s'il est verbeux) est le bienvenu.
Marsh Posté le 25-07-2004 à 01:18:42
Callback. Ton process est asynchrone. Donc si ton thread n'est pas capable de gérer l'erreur lui meme, il doit callbacker le "master", l'objet qui lui pourra le faire (ou joindre un composant capable de le faire)
Clairement tu passes une référence de callback à ton thread et tu l'utilises lorsqu'une exception doit etre remontée.
Marsh Posté le 25-07-2004 à 01:19:38
nraynaud a écrit : perso, l'implémentation la plus simple des files de messages est que je conaisse une LinkedList avec un wrapper synchronized. |
ça me dérange pas de mettre un thread en polling sur la file de message. J'ai juste un peu peur que ça devienne carrément ingérable quand je vais lancer des collectes sur plusieurs postes de données différentes par nature et type. Faut bien s'occuper.
Marsh Posté le 25-07-2004 à 01:24:29
DarkLord a écrit : Callback. Ton process est asynchrone. Donc si ton thread n'est pas capable de gérer l'erreur lui meme, il doit callbacker le "master", l'objet qui lui pourra le faire (ou joindre un composant capable de le faire) |
J'arrête pas de faire des callbacks avec ce stack ! /o\
Tiens d'ailleurs, il me semble que tu le connais ce stack, t'en penses quoi ?
Marsh Posté le 25-07-2004 à 01:43:57
cerisier > http://opensvn.csie.org/jcoincoin/ [...] ncoin/net/
le Networkscheduler (qui est un SINGLETON spécial --) reçoit des unités de travail (Task) et les exécute.
http://opensvn.csie.org/jcoincoin/ [...] ibune.java
Tribune.SenderTask est une tache qui envoie un OutputMessage sur le réseau.
Les OutputMessage sont listenable, et les listeners ont une callback et sont prévenus en cas d'exception lors de l'envoi du bouzin au serveur.
http://opensvn.csie.org/jcoincoin/ [...] ssage.java
ce qui fait donc que c'est à celui qui veut envoyer le message de se démerder avec ce qu'il veut faire de l'erreur.
le plopBot ne donne même pas de listener :
http://opensvn.csie.org/jcoincoin/ [...] opBot.java
l'interface graphique signale l'erreur et n'efface pas le message de la zone de saisie (chercher OutputMessage.Listener dans la page) :
http://opensvn.csie.org/jcoincoin/ [...] inGui.java
à noter que dans le dernier cas, le retour dans le thread de répartition des évènements swing se fait avec un SwingUtilities.invokeLater().
Marsh Posté le 25-07-2004 à 01:48:38
nraynaud a écrit : |
Marsh Posté le 25-07-2004 à 02:50:20
haben sie ein problem ?
edit : c'est le meilleur moyen que j'ai trouvé pour pas exploser la bande passante au démarrage et par la suite.
Marsh Posté le 25-07-2004 à 08:51:12
nraynaud a écrit : cerisier > http://opensvn.csie.org/jcoincoin/ [...] ncoin/net/ |
Marsh Posté le 25-07-2004 à 13:31:45
J'ai insisté là dessus qd j'ai envoyé son code au vendeur de pizza
C'est vrai, nraynaud, que c'est diablement bien implémenté ce truc
Marsh Posté le 25-07-2004 à 13:40:53
Cherrytree a écrit : J'arrête pas de faire des callbacks avec ce stack ! /o\ |
Je ne le connais pas, je l'ai référencé sur ce forum en cherchant bêtement sur google et parce qu'il me semblait être le meilleur choix à première vue.
Sinon pour le callback, tout dépend si tu veux gérer l'erreur de manière synchrone ou non.
Marsh Posté le 29-07-2004 à 09:47:09
Je viens de passer un petit bout de temps à admirer la belle ouvrage mis en place dans NetworkScheduler et j'ai quelques questions sur les choix d'implémentation :
- Pourquoi ne pas avoir fait de Task un Runnable ? Ne serait-ce pas intéressant en place de work(), d'avoir un run(), qui permettrait d'utiliser l'objet Task hors du Scheduler, directement dans un bête Thread ?
- Je n'ai pas saisi la raison (car je sens qu'il y en a une) pour laquelle une PeriodicTask est une Task. Cela me semble lié au fait que tu confonds le membre Task et la PeriodicTask qui l'englobe (equals(), hashCode()), mais je ne vois pas le truc.
- Pourquoi le Timer est initialisé dans le constructeur de NetworkScheduler ? Tu sembles pourtant préférer l'initialisation des membres dès leur déclaration. ça porte un nom au fait, cette pratique qui consiste à initialiser au plus tôt, comme tu le fais ?
Je veux programmer comme toi. Que me conseilles-tu ?
Marsh Posté le 29-07-2004 à 12:25:19
1) pour pas qu'un boulet me prenne un Task je ne sais où et le mette dans son thread. un Task, ça va dans un networkscheduler, pas ailleur.
2) on wrappe la Task, pour que à la fin de son traitement, elle se re-planifie toute seule.
3) ça a été modifié dans ma working-copy il y a une semaine, mais je peux pas comitter pour l'instant (because j'ai fait 15000 trucs dedans à la fois et y'en a un pas fini qui rend tout inutilisable).
4) avoir une vie de merde.
Marsh Posté le 29-07-2004 à 13:46:45
1) C'est un choix qui se défend.
2) Avec ton indication j'ai relu le source : c'est la clause finally de la méthode work() qui donne la solution.
3) OK, donc je vais avoir des choses passionnantes à découvrir. Ton commit est prévu pour quand ?
4) Moi j'trouve ça génial de coder si bien. J'suis sûr que ça peut servir
Marsh Posté le 29-07-2004 à 13:56:44
4) on peut pas dire que ça m'a beaucoup servi jusqu'à maintenant Peut-être parce que les gens qui recrutent ne savent pas ce que c'est que du code.
Marsh Posté le 29-07-2004 à 14:00:50
nraynaud a écrit : 1) pour pas qu'un boulet me prenne un Task je ne sais où et le mette dans son thread. un Task, ça va dans un networkscheduler, pas ailleur. |
J'aime bien la facon dont tu ecris le code, c'est clair. J'essaie de faire comme ca mais je dérape des fois.
Sinon, je n'ai que rapidement parcouru les fichiers que tu cites, et je m'apercoit que je ne sais pas ce que fais ton appli (j'ai la fleme de lire le code et dechiffrer, j'ai cherché une page de description, mais j'ai pas trouvé ). Tu mettras 2s a me le dire, là ou je mettrais 1h a lire
4) assez d'accord (je parle pour moi). Un jour, je fus comme ca j'ai arrété le jour où j'ai compris que ca ne m'apportait rien, si ce n'est la satisfaction d'avoir créé qqchose. Ce genre de travail est tres mal reconnu. En plus, les bugs, les gens pas contents de telle ou telle fonctionnalité manquante, ont finit par me bouffer tout mon temps libre et ont eu raison de ma volonté.
Maintenant, je ne code que pour le boulot => argent. C'est le seul interet que j'y trouve.
Marsh Posté le 29-07-2004 à 14:05:30
nraynaud a écrit : 4) on peut pas dire que ça m'a beaucoup servi jusqu'à maintenant Peut-être parce que les gens qui recrutent ne savent pas ce que c'est que du code. |
4) et parce que n'importe qui peut marquer sur son CV : C#, C++, java, javaBeans, RMI, MFC, PHP, ASP, VB, Python, Perl ...
J'ai rencontré trop de cas comme ca : la dernière personne qui a repris un de mes softs (prototype) au boulot, etait de ceux là. Incompétent en prog, il m'a ruiné le soft (ok, c'est pas facile de reprendre du code qu'on a pas écris) et maintenant le soft est abandonné (il y a plus de bugs qu'avant ) et ils en ont achèté un à l'extérieur...
(7 mois de boulot pour rien)
Marsh Posté le 29-07-2004 à 14:17:07
nraynaud a écrit : 4) on peut pas dire que ça m'a beaucoup servi jusqu'à maintenant Peut-être parce que les gens qui recrutent ne savent pas ce que c'est que du code. |
Parce que les gens qui recrutent se fient plus à la première impression qu'au contenu du CV en général.
Marsh Posté le 29-07-2004 à 14:30:10
DarkLord a écrit : Parce que les gens qui recrutent se fient plus à la première impression qu'au contenu du CV en général. |
N'empêche que du code comme ça, je n'en vois jamais. Je ne sais pas écrire comme ça. Et dans ma boite, ils parlent l'objet comme une vache espagnole.
Si ça existait, j'achèterais ce bouquin : "Programmer comme nraynaud pour les nuls".
EDIT : manquait un mot
Sinon nraynaud, y a quoi qui change dans le NetworkScheduler ? Je le trouve impec' comme ça ? Un petit teaser ? Et sinon, je pars en vacances dans 3 jours : tu me conseilles quoi comme saine lecture ?
Marsh Posté le 29-07-2004 à 15:03:11
cherytree > uniquement le point que tu as soulevé je crois, c'est juste que je ne me suis mis il n'y a qu'une semaine ou 2 à vraiment tout mettre en instanciation lazy.
Je démarre éclipse, je fais un diff pour vérifier et je poste le code.
Marsh Posté le 29-07-2004 à 15:08:59
nraynaud a écrit : 1) cherytree > uniquement le point que tu as soulevé je crois, c'est juste que je ne me suis mis il n'y a qu'une semaine ou 2 à vraiment tout mettre en instanciation lazy. |
1) C'est donc comme cela que ça s'appelle.
2)
Sinon, je ne sais pas si tu as la main dessus, mais http://opensvn.csie.org/ a l'air en rade. J'essayais de voir quelles classes implémentent Task... et paf.
Sinon concernant la litérature, tu ne peux rien m'apprendre ?
Marsh Posté le 29-07-2004 à 15:13:34
Si c'est moi qui l'écrit ça ira?
(je lui ai tout appris )
Marsh Posté le 29-07-2004 à 15:14:27
cerisier > oui, passé le timeout en macro, lazy instanciation du timer et du thread de pompage et un commentaire :
Code :
|
Marsh Posté le 29-07-2004 à 15:24:53
c'est grace à -- que je suis dans l'élite mondiale du java ...
(par contre, moi je sais dans quel état se réveille un bean /o\)
Marsh Posté le 29-07-2004 à 16:00:48
Marsh Posté le 29-07-2004 à 16:06:09
si tu l'avais sû, tu aurais peut-être pu lui expliquer toi-même
(j'ai la ouache, ça doit être parce que l'ANPE vient de me refiler un contact douteux, alors j'exprime ma joie)
Marsh Posté le 29-07-2004 à 16:09:01
nraynaud a écrit : si tu l'avais sû, tu aurais peut-être pu lui expliquer toi-même |
Je ne rigolais pas pour ça
Marsh Posté le 29-07-2004 à 16:19:21
DarkLord a écrit : Je ne rigolais pas pour ça |
ça t'apprendra à faire une quote ?
Marsh Posté le 29-07-2004 à 16:26:41
nraynaud a écrit : ça t'apprendra à faire une quote ? |
non.
Citation : |
Marsh Posté le 29-07-2004 à 17:11:49
Jubijub a écrit : certain amouth of time to complete = certain amount of time to complete |
Oui bon dans ce cas, on a aussi des curently, betwen, regulary, it's execution, et periodicaly (pas sûr mais presque que ça prend 2 'l's).
Marsh Posté le 25-07-2004 à 00:01:35
Dans une application monothread, c'est un choix :
- soit je catch
- soit je throw
En multithread, comment notifier la parent du thread que celui-ci a eu un problème ?