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

  FORUM HardWare.fr
  Programmation
  Java

  [debutant] thread | wait() notify()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[debutant] thread | wait() notify()

n°1370037
guiguivts
Posté le 18-05-2006 à 21:25:45  profilanswer
 

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 :)

mood
Publicité
Posté le 18-05-2006 à 21:25:45  profilanswer
 

n°1370095
guiguivts
Posté le 18-05-2006 à 21:51:58  profilanswer
 

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:  

n°1370125
guiguivts
Posté le 18-05-2006 à 22:12:54  profilanswer
 

Please  :(

n°1370171
mrbebert
Posté le 18-05-2006 à 23:24:29  profilanswer
 

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 :)

n°1370174
mrbebert
Posté le 18-05-2006 à 23:28:05  profilanswer
 

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]  

n°1370181
guiguivts
Posté le 18-05-2006 à 23:44:40  profilanswer
 

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. :(

n°1370189
mrbebert
Posté le 18-05-2006 à 23:50:56  profilanswer
 

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
n°1370203
guiguivts
Posté le 19-05-2006 à 00:06:47  profilanswer
 

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

n°1371227
guiguivts
Posté le 20-05-2006 à 19:39:03  profilanswer
 

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 :)

n°1371354
guiguivts
Posté le 21-05-2006 à 00:19:06  profilanswer
 

please :)

mood
Publicité
Posté le 21-05-2006 à 00:19:06  profilanswer
 

n°1371651
mrbebert
Posté le 21-05-2006 à 19:37:02  profilanswer
 

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

n°1371820
guiguivts
Posté le 22-05-2006 à 01:20:03  profilanswer
 

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 :)

n°1371823
mrbebert
Posté le 22-05-2006 à 01:47:54  profilanswer
 

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


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

  [debutant] thread | wait() notify()

 

Sujets relatifs
debutant serveur webC++ comment travailler sur des fichiers .txt (débutant)
Une erreur de débutantthread écoutant hal (spécifique à linux)
tkinter et thread[Résolu] Arrêter un Thread qui attend un paquet sur un DatagramSocket
Probleme syntaxe thread librairie pthreadThreads sur un serveur J2EE ? Thread en tant que Singleton?
fermeture d'un programme - MFC - debutant[Perl] Débutant : Rechercher mot-clé et extraire paragraphe
Plus de sujets relatifs à : [debutant] thread | wait() notify()


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