Synchronisation de threads

Synchronisation de threads - Java - Programmation

Marsh Posté le 12-05-2003 à 15:49:07    

bonjour
 
en cours, on a commencé les threads en java, et je comprends rien sur la synchronisation, c'est pas évident.
 
je donne un exemple d'un exercice qui me pose probleme :
 
- je créé une fonction (threadFonction)dans laquelle une boucle while tourne jusque ce que i == true
- a la fin de cette boucle while, je fais un appel à une fonction nettoyer()
 
dans mon programme principal, je créé ensuite 8 threads qui executent tous la meme fonction (threadFonction)
 
et mon probleme est la : sachant que la threadFonction est executée 8 fois simultanement, comment faire pour appeler la fonction nettoyer() qu'une seule fois ?
 
j'ai vu des sources en C# dans lesquels le thread envoie un evenement au thread principal qui se charge ensuite d'appeler l'equivalent de ma fonction nettoyer(), mais j'aurais voulu savoir d'autres manieres de faire plus simples.
 
benou, à l'aide ;)


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 12-05-2003 à 15:49:07   

Reply

Marsh Posté le 12-05-2003 à 15:53:28    

t'es aller voir les tuts de sun ?  :heink:


---------------
get amaroK plugin
Reply

Marsh Posté le 12-05-2003 à 15:54:20    

il y a une chose simple à faire :
 

Code :
  1. private nettoyerDone = false;
  2. publiv void synchronized nettoyer() {
  3.    if (! nettoyerDone) {
  4.       // ici tu mets ton code de nettoyage
  5.      nettoyerDone = true;
  6.    }
  7. }


la méthode sera appelée plusieurs fois, mais jamais 2 fois en même temps (puisqu'elle est synchronized), et dans le cas où elle a déjà été appellée, les futurs appels ne ferons rien.
 
C'est une solution simple à ton problème

Reply

Marsh Posté le 12-05-2003 à 16:02:58    

benou a écrit :

il y a une chose simple à faire :


merci, j'avais du mal a comprendre l'utilité de synchronized, je viens de comprendre :jap:
en fait, ce mot clé garantit que la methode ne sera accédee que par un thread a la fois.
mais que font les autres threads pendant ce temps ? ils attendent que le thread soit sorti de la methode pour y rentrer ?
et tu penses quoi de la methode de harkonnen (un evenement envoyé par le thread au programme principal), c'est aussi propre que ce que tu me proposes ?


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 12-05-2003 à 16:30:55    

vic le viking a écrit :

mais que font les autres threads pendant ce temps ? ils attendent que le thread soit sorti de la methode pour y rentrer ?


bha oui ...
 

vic le viking a écrit :


et tu penses quoi de la methode de harkonnen (un evenement envoyé par le thread au programme principal), c'est aussi propre que ce que tu me proposes ?


le truc d'harko peut marcher aussi :
tu peut mettre ton thread principal en attante en fesant ca après avoir lancé tes threads :
 
 

Code :
  1. sycnhronized (this) {
  2.    try {
  3.       this.wait();
  4.    } catch (InterruptedException e) {
  5.       Thread.currentThread().interrupt();
  6.    }
  7. }
  8. nettoyer();


 
et dans chacun de tes threads, il faudra qu'il possède une référence de ton thread pricnipal (ou plus précisément de l'objet que représente this dans le code ci-dessus), et plutot que d'appeler nettoyer à la fin de la boucle, tu mets ce code là :

Code :
  1. while (tonBooleen) {
  2. ...
  3. }
  4. sycnhronized (lObjetSurLequelTuAsFaiWait) {
  5.    lObjetSurLequelTuAsFaiWait.notify();
  6.    // ca réveille le thread dans lequel le wait a été fait
  7. }


 
les deux méthodes sont valables. Dans la mienne l'inconvénient est que tous les threads vont se bloquer sur la méthode nettoyer le temps que celle-ci soit executée, dans la méthode harko, le problème c'est que ca bloque le thread principal ...

Reply

Marsh Posté le 12-05-2003 à 17:33:51    

merci pour ton explication claire :jap:
mine de rien, j'ai largement mieux compris ton explication que celle du prof :(
par curiosité, tu emploies quelle méthode dans ton bot ? celle que tu décris, ou celle de harkonnen ?


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 12-05-2003 à 17:42:51    

j'utilise les 2.
 
en fait j'utilise la 1ere méthode de façon à ce que je n'ai qu'un seul thread qui fasse le notify pare que dans mon cas c'est important : je remets le thread principal en wait juste après qu'il ait été redémarré => si un des autres thread le notify, ca le réveil alors que ca n'aurait pas dû.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed