Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1699 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Problème de conception

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de conception

n°459255
R3g
fonctionnaire certifié ITIL
Posté le 16-07-2003 à 12:42:15  profilanswer
 

Alors voila le problème : j'ai une classe Buffer ; en fait c'est pas vraiment un buffer mais bon. Quand on y ajoute un objet, celui-ci subit un traitement effectué par un autre objet implémentant une interface Worker.
J'ai un type de Worker qui effectue son traitement de manière asynchrone : il hérite de Thread, et quand on lui passe un objet, il est ajouté à une file d'attente.
Donc la chose se fait comme ça :

Code :
  1. // contruire le Buffer
  2. Buffer buffer = new Buffer(5);
  3. // construire le Worker
  4. Worker worker = new AsynchWorker();
  5. // lancer le worker et l'adjoindre au buffer
  6. worker.start();
  7. buffer.addWorker(worker);
  8. // utiliser le buffer
  9. buffer.push(truc);


 
Mon problème est donc : comment arrêter proprement mon Thread ?
Le moyen qui m'a sauté au visage était d'appeler stop() dans le finalize() de mon Buffer. Mais ca me fait utiliser à la fois finalize() et instanceof, deux trucs sales que j'aime pas.
Il doit y avoir plus propre mais je ne vois pas, sachant que ca va pas être trop facile de garder une référence sur le worker ailleurs que dans buffer. Une idée ?

mood
Publicité
Posté le 16-07-2003 à 12:42:15  profilanswer
 

n°459359
phnatomass
Je m'empare de ton esprit !!
Posté le 16-07-2003 à 14:30:49  profilanswer
 

R3g a écrit :


Code :
  1. buffer.addWorker(worker);




Pourquoi as tu un Buffer de Worker ?
Ton worker devrait excuter son traitement tout en ayant une fonction ajouterTraitement qui placerait donc ton nouveau traitement à la queue des traitements devant êtres executés par ton Worker.

R3g a écrit :


Code :
  1. // utiliser le buffer
  2. buffer.push(truc);




 
Rapport en entre truc et Worker ?
Ne mélanges tu pas les serviettes et les torchons.

R3g a écrit :


Mon problème est donc : comment arrêter proprement mon Thread ?
Une idée ?


Je pense que ta la méthode run de ton Worker doit avoir une boucle infinie alors ajoute une methode arret() qui positionnera un flag à vrai par exemple et ainsi à chaque tour de boucle tu verifiera la valeur de ce flag pour savoir si tu lances le prochain traitement ou si tu sors de ta méthode run.
 
Dans le cas du multithreading la méthode finalize() n'est pas "sale". Imaginons que tes traitement sont des manipulations dans des bases de données donc les connexions serons assuré par un pool, la méthode finalize te permet d'etre sur de liberer tes ressources proprement .


Message édité par phnatomass le 16-07-2003 à 14:33:47
n°459382
benou
Posté le 16-07-2003 à 14:47:56  profilanswer
 

mon avis sur la question :  
 
ton AsynchWorker est créé en dehors du buffer. C'est un objet inédpendant du buffer. Il n'y a donc pas de raison que ce soit le buffer qui arrête le Thread. D'ailleur tu as bien vu le problème : il n'y a aucune raison qeu le Buffer puisse arrêter le thread puisque qu'il n'est pas sensé savoir si un worker est threadé ou non. C'est ce qui t'oblige à faire le instance of, ce qui effectivement dans ce cas est crade.
 
donc je vois 2 solutions :  
 1) tu arrêtes le thread en dehors du Buufer, mais je ne connais pas assez ton prog pour savoir si c'est possible/facile
 2) tu ajoutes une gestion de cycle de vie à tes workers en ajoutant une methode startWork() et une methode stopWork() à l'interface Worker. Le problème c'est que ca t'oblige à modifier les classes implémentant Worker  déjà écrite ...
 


---------------
ma vie, mon oeuvre - HomePlayer
n°459386
benou
Posté le 16-07-2003 à 14:50:12  profilanswer
 

phnatomass a écrit :


Dans le cas du multithreading la méthode finalize() n'est pas "sale". Imaginons que tes traitement sont des manipulations dans des bases de données donc les connexions serons assuré par un pool, la méthode finalize te permet d'etre sur de liberer tes ressources proprement .


 :non: utiliser finalize habituellement c'est une mauvaise idée. Tu n'as aucune garantie que la méthode sera appelée...
 
finalize peut être utilisée "par sécurité" mais il doit toujours exister un moyen de "fermer" un objet qui le nécessite de façon manuelle !


---------------
ma vie, mon oeuvre - HomePlayer
n°459387
lorill
Posté le 16-07-2003 à 14:51:04  profilanswer
 

benou a écrit :

Le problème c'est que ca t'oblige à modifier les classes implémentant Worker  déjà écrite ...


avec eclipse ou n'importe quel outil de refactoring, tu modifies l'interface ca t'ajoute les methodes dans toutes les classes qui l'implémentent.

n°459388
benou
Posté le 16-07-2003 à 14:53:25  profilanswer
 

lorill a écrit :


avec eclipse ou n'importe quel outil de refactoring, tu modifies l'interface ca t'ajoute les methodes dans toutes les classes qui l'implémentent.


oauis mais t'as pas toujours accès ou le droit de modifier ces classes ...  
 


---------------
ma vie, mon oeuvre - HomePlayer
n°459557
R3g
fonctionnaire certifié ITIL
Posté le 16-07-2003 à 17:55:44  profilanswer
 

benou a écrit :

mon avis sur la question :  
 
ton AsynchWorker est créé en dehors du buffer. C'est un objet inédpendant du buffer. Il n'y a donc pas de raison que ce soit le buffer qui arrête le Thread. D'ailleur tu as bien vu le problème : il n'y a aucune raison qeu le Buffer puisse arrêter le thread puisque qu'il n'est pas sensé savoir si un worker est threadé ou non. C'est ce qui t'oblige à faire le instance of, ce qui effectivement dans ce cas est crade.
 
donc je vois 2 solutions :  
 1) tu arrêtes le thread en dehors du Buufer, mais je ne connais pas assez ton prog pour savoir si c'est possible/facile
 2) tu ajoutes une gestion de cycle de vie à tes workers en ajoutant une methode startWork() et une methode stopWork() à l'interface Worker. Le problème c'est que ca t'oblige à modifier les classes implémentant Worker  déjà écrite ...
 
 


On est bien d'accord.
Effectivement je pensais que la meilleure méthode est d'arrêter le thread en dehors du buffer. Le problème est que ca m'oblige à garder une référence sur le worker, et il me faudrait un objet exprès pour ça, car il peut y avoir plusieurs buffer donc plusieurs worker.
Ou alors que je demande au buffer son worker pour l'arrêter avant quand je n'ai plus besoin du buffer... Ca revient un peu au même que les methodes start et stop dans le worker...
Le problème c'est q le faitque le worker soit threadé ou non dépend des préférences de l'utilisateur, et j'aurais aimé ne pas avoir besoin de cette info trop souvent. Donc effectivement je crois que je vais modifier l'interface.

n°459603
benou
Posté le 16-07-2003 à 19:33:48  profilanswer
 

si tu peux te le permettre, la modification de l'interface est la meilleur méthode à mon avis ...
 
dans le cas où le worker n'est pas threadé, les méthode start et et stop ne feront rien ... c'est pas grave ...


---------------
ma vie, mon oeuvre - HomePlayer
n°459637
nraynaud
lol
Posté le 16-07-2003 à 20:29:53  profilanswer
 

benou a écrit :


ton AsynchWorker est créé en dehors du buffer. C'est un objet inédpendant du buffer. Il n'y a donc pas de raison que ce soit le buffer qui arrête le Thread. D'ailleur tu as bien vu le problème : il n'y a aucune raison qeu le Buffer puisse arrêter le thread puisque qu'il n'est pas sensé savoir si un worker est threadé ou non.  

Design pattern Expert : c'est celui qui a l'info qui bosse.
pattern forte cohésion : on ne diffuse pas l'information plus que nécessaire.
 
(les 2 sont de "UML et les Design pattern", C. Larman si je me plante pas)


---------------
trainoo.com, c'est fini

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Problème de conception

 

Sujets relatifs
Problème de popup récurrent (tjdo)[PHP/MySQL]Problème d'UPDATE avec une variable contenue dans l'url
URGENT problème avec copy() de PHP[Mysql + MyODBC]Problème de lenteur !!
Probleme avec la propriété FormulaArray sous VBA (Excel)[HTML] Problème de conception
[JAVA] Problème de conceptionprobleme dans la conception d'une interface graphique
[Java] Problème de conception lié aux interfaces[VC++] problème de conception d'une app SDI ...
Plus de sujets relatifs à : Problème de conception


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR