thread | wait() notify() [debutant] - Java - Programmation
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!
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
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 ? |
Avec ou sans le wait()
Le wait() met "en pause", mais ne change pas l'ordre d'exécution des instructions
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.
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
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
Reste donc à le réveiller, avec la méthode notify() semble t'il
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. |
Waip
c'est bon pour le moment ça marche je vais pouvoir continuer! je suis pas couché!
merci
bye
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
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 ?
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 ?
mici
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)
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) |
Waip ça a bien marché ça
et pour ma premiere question ?
question bonus comment detecter qu'un utilisateur à taper control C ?
merci en tous cas
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
merci