[debutant] thread | wait() notify()

thread | wait() notify() [debutant] - Java - Programmation

Marsh Posté le 18-05-2006 à 21:25:45    

Salut!
 
Question débile mais question quand même j'aimerai savoir à quoi ça sert de mettre un thread en attente avec wait() et de le reveiller apres. Me renvoyer pas vers la doc please j'en ai déjà lu pas mal.
 
je m'explique sur un exemple  
 
vous avez une classe ressource, une classe lecteur et une classe ecrivain, un lecteur lit la ressource, un ecrivain ecrit la ressource mais ils ne peuvent pas le faire tous les deux en meme temps!
 
j'ai donc entre autre ça comme méthode  
 
  public  synchronized void requeteEcriture(){
    try{
      while(unLecteurActif) {
 wait();
      }
      unEcrivainActif = true;
    }catch (InterruptedException e){}
     
  }
 
 
  public void run() {
    try {
      cptE.requeteEcriture();
      // on fait l'ecriture
 
 
    ...
 
En gros dans le run de la classe ecrivain, il demande d'abord à la ressource si il y a un lecteur qui lit la ressource ou pas. Et tant qu un lecteur est actif on attent et on 'endort' le thread.  
 
j'aimerais savoir à quoi cela sert d'endormir le thread étant donné que même sans le wait tant qu'il y aura un lecteur actif on restera dans la boucle et le thread ne pourra pas continuer de s'executer ?? j'ai bien dans l'idée que en endormant le thread on libere un peu le processeur, mais bon pour ce que je fais c'est dérisoire. quelqu'un peut m'expliquer ? car j'ai l'impression que j'ai raté une partie du cours  :D  
 
merci :)

Reply

Marsh Posté le 18-05-2006 à 21:25:45   

Reply

Marsh Posté le 18-05-2006 à 21:51:58    

en fait je voulais savoir quelle est la différence si j'enleve le wait ?  :??:  
 
De plus je viens de tester avec le wait et c'est bizarre il ne fait pas la suite des instruction apres le wait je croyais que le wait bloquait le thread pas la boucle!  :pt1cable:  

Reply

Marsh Posté le 18-05-2006 à 22:12:54    

Please  :(

Reply

Marsh Posté le 18-05-2006 à 23:24:29    

Oui, le wait() permet au processus d'être mis en pause. Ainsi, l'OS fait tourner uniquement les processus actifs. Sinon, ce processus utiliserait lui aussi le CPU, inutilement :)

Reply

Marsh Posté le 18-05-2006 à 23:28:05    

guiguivts a écrit :

en fait je voulais savoir quelle est la différence si j'enleve le wait ?  :??:  
 
De plus je viens de tester avec le wait et c'est bizarre il ne fait pas la suite des instruction apres le wait je croyais que le wait bloquait le thread pas la boucle!  :pt1cable:

Avec ou sans le wait() :??:  
Le wait() met "en pause", mais ne change pas l'ordre d'exécution des instructions [:proy]  

Reply

Marsh Posté le 18-05-2006 à 23:44:40    

En fait j'ai l'impression que dans ma boucle des qu il y a le wait le thread s'endort mais à priori si j'ai bien compris ma boucle qui fait parti du thread s'endort aussi!!  
 
Donc il faut qu'elle soit révéillée par un autre thread.
 
Le probleme c'est que quand à partir d'un autre thread (t2) je fais réveillé ce thread(t1) il me crache des erreurs et me dit qu'il peut pas le réveillé car il est pas le propriétaire. :(

Reply

Marsh Posté le 18-05-2006 à 23:50:56    

Oui, c'est toute l'exécution du processus qui est mise en pause. Le programme est "figé", mais il reprend son exécution exactement à l'endroit où il s'était endormi.
Peut être qu'il s'endort, mais ne se réveille jamais [:figti]
 
edit : après une très brêve recherche, il semblerait que, effectivement, wait() endort indéfiniment en attendant que quelqu'un d'autre (un autre thread) le réveille [:figti]  
Reste donc à le réveiller, avec la méthode notify() semble t'il :)

Message cité 1 fois
Message édité par mrbebert le 18-05-2006 à 23:53:47
Reply

Marsh Posté le 19-05-2006 à 00:06:47    

mrbebert a écrit :

Oui, c'est toute l'exécution du processus qui est mise en pause. Le programme est "figé", mais il reprend son exécution exactement à l'endroit où il s'était endormi.
Peut être qu'il s'endort, mais ne se réveille jamais [:figti]
 
edit : après une très brêve recherche, il semblerait que, effectivement, wait() endort indéfiniment en attendant que quelqu'un d'autre (un autre thread) le réveille [:figti]  
Reste donc à le réveiller, avec la méthode notify() semble t'il :)


 
Waip :)
 
c'est bon pour le moment ça marche je vais pouvoir continuer! :) je suis pas couché!
 
merci ;)
 
bye

Reply

Marsh Posté le 20-05-2006 à 19:39:03    

Salute :)
 
Apres quelque dizaines d'heures dessus je comprend un peu mieux ce qui se passe :D
 
mon projet est fini mais j'ai deux ptites questions car là c'est vraiment moche  
 
Je fais un espece de tchat donc je récuper les flux d'entrée d'une personne et je renvoie vers le flux de sortie d'une autre personne.
 
le probleme c'est que lorsque une personne écrit, elle ne voit pas ce qu'elle écrit. j'ai bien pensé récuperer le flux d'entrée de ce qu'elle écrite et lui renvoyer directement dans son flux de sortie mais du coup ça l'écrite en double!!
 
voilà mon bout de code
 
char charcourant[]=new char[1];
 while((_entree.read(charcourant,0,1)!=-1)&&(stop==0))
 {
  _sortie.write(charcourant[0]);
  _sortie.flush();
 
 
pourquoi ça l'écrit en double ?  :heink:  
 
et deuxieme petite question  
 
Apres avoir récuperer le flux d'entrée d'une personne je l'envoie vers le flux de sortie d'une autre. je fais ça en boucle donc les mots se succedent j'aimerai bien mettre chaque mot à la ligne donc j'ai rajouter un \n apres chaque mot lu. l'ennui c'est que ça me l'affiche comme ça :
 
ceci  
      est  
           un essai
 
et j'aimerai bien que ça me l'affiche comme ça :)
 
cecie
est
un essai  
 
:)
 
quelqu'un a une idée svp ?  :D  
 
mici :)

Reply

Marsh Posté le 21-05-2006 à 00:19:06    

please :)

Reply

Marsh Posté le 21-05-2006 à 00:19:06   

Reply

Marsh Posté le 21-05-2006 à 19:37:02    

Pour les retours à la lignes, essaie avec "\r\n" au lieu de seulement "\n" (si tu es sous Windows) [:figti]

Reply

Marsh Posté le 22-05-2006 à 01:20:03    

mrbebert a écrit :

Pour les retours à la lignes, essaie avec "\r\n" au lieu de seulement "\n" (si tu es sous Windows) [:figti]


 
Waip ça a bien marché ça :)
 
et pour ma premiere question ?  :D  
 
question bonus comment detecter qu'un utilisateur à taper control C ?  :??:  
 
merci en tous cas :)

Reply

Marsh Posté le 22-05-2006 à 01:47:54    

Je sais pas :D  
Doit y avoir une boucle quelque part :pt1cable:

Reply

Sujets relatifs:

Leave a Replay

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