Question sur wait()
2 participants
Page 1 sur 1
Question sur wait()
Bonjour
J'ai eu un peu de mal à comprendre le mecanisme de wait().
Quand un objet appelle cette fonction, le processus est suspendu ou annulé?
J'ai un exemple:
class A implements Runnable{
private boolean b=true;
public void dodo(){
while(b){
wait();
}
}
public void run(){
while(!Thread.InterruptedException){
dodo();
System.out.println("blabla");
}
}
}
C'est un exemple dans lequel j'amerais savoir si le thread sera interrompu quand l'objet A est en wait() et
je fais:
Thread t=new Thread(new A());
t.start();
t.interrupted();
Quand l'objet A passe en wait, le processus est stoppé en queleque sorte ou bloqué dans la fonction dodo(),
du coup si on le réveille pas , il ne peut plus jamais verifier la condition de while?
Merci en avance
J'ai eu un peu de mal à comprendre le mecanisme de wait().
Quand un objet appelle cette fonction, le processus est suspendu ou annulé?
J'ai un exemple:
class A implements Runnable{
private boolean b=true;
public void dodo(){
while(b){
wait();
}
}
public void run(){
while(!Thread.InterruptedException){
dodo();
System.out.println("blabla");
}
}
}
C'est un exemple dans lequel j'amerais savoir si le thread sera interrompu quand l'objet A est en wait() et
je fais:
Thread t=new Thread(new A());
t.start();
t.interrupted();
Quand l'objet A passe en wait, le processus est stoppé en queleque sorte ou bloqué dans la fonction dodo(),
du coup si on le réveille pas , il ne peut plus jamais verifier la condition de while?
Merci en avance
Heros- Posts : 12
Join date : 08/09/2017
Re: Question sur wait()
En fait, cela est évoqué dans la vidéo XIII sur la terminaison d'une thread (semaine 2).
Interrupt ne provoque pas une interruption au sens "signal Unix" qui tue un processus. Il positionne un flag que vous pouvez tester (attention, vous ne le testez qu'une seule fois car après le test, il est remis à zéro) de manière à savoir si on vous a demandé une interruption. Mais si vous êtes dans un wait, alors vous ne pouvez recevoir ni tester ce flag et du coup, le système vous prévient à la sortie du wait() au moyen d'une exception (levée par wait() en fait).
Dans vore exemple, ce qui me trouble est que vous devriez utiliser la méthode Thread.interrupted() pour tester l'exception. De plus, je pense qu'il ne compilera pas (je n'ai pas essayé faute de temps) car vous ne protégez pas les exceptions générées par wait() ni la propagez dans la méthode dodo(). Si tout cela était réglé, le comportement du programme dépendrait de faut que dodo() dans run() ait eu le temps de s'exécuter ou non.
Est-ce plus clair?
Interrupt ne provoque pas une interruption au sens "signal Unix" qui tue un processus. Il positionne un flag que vous pouvez tester (attention, vous ne le testez qu'une seule fois car après le test, il est remis à zéro) de manière à savoir si on vous a demandé une interruption. Mais si vous êtes dans un wait, alors vous ne pouvez recevoir ni tester ce flag et du coup, le système vous prévient à la sortie du wait() au moyen d'une exception (levée par wait() en fait).
Dans vore exemple, ce qui me trouble est que vous devriez utiliser la méthode Thread.interrupted() pour tester l'exception. De plus, je pense qu'il ne compilera pas (je n'ai pas essayé faute de temps) car vous ne protégez pas les exceptions générées par wait() ni la propagez dans la méthode dodo(). Si tout cela était réglé, le comportement du programme dépendrait de faut que dodo() dans run() ait eu le temps de s'exécuter ou non.
Est-ce plus clair?
Re: Question sur wait()
Admin a écrit:En fait, cela est évoqué dans la vidéo XIII sur la terminaison d'une thread (semaine 2).
Interrupt ne provoque pas une interruption au sens "signal Unix" qui tue un processus. Il positionne un flag que vous pouvez tester (attention, vous ne le testez qu'une seule fois car après le test, il est remis à zéro) de manière à savoir si on vous a demandé une interruption. Mais si vous êtes dans un wait, alors vous ne pouvez recevoir ni tester ce flag et du coup, le système vous prévient à la sortie du wait() au moyen d'une exception (levée par wait() en fait).
....................
Est-ce plus clair?
Bonsoir
Merci de votre réponse.
Du coup pour que le thread(new A()) soit interrompu, est-ce qu'il faut que je le réveille dans dodo() dans un premier temps?
En ce moment j'ai commencé le TP4, j'ai du mal à interrompre les 2 thread de moteurvitres dans run() de gestionnaire.
Heros- Posts : 12
Join date : 08/09/2017
Re: Question sur wait()
Encore une fois, Interrupt (la mal nommée, je me suis fait avoir au début) n'envoie pas d'interruption comme on peut en avoir l'habitude avec Unix. Elle pistonne ce fameux flag est c'est à vous de le tester. L'exception n'est levée qe si vous n'êtes pas en mesure de le faire (i.e. en mode wait).
L'intérêt de cela (car il y en a un) est de ne pas provoquer brutalement la terminaison de thread qui seraient dans l'incapacité de relâcher des ressources qu'elles ont réservées... Bref, et j'aurais du le dire plus tôt, cela semble étrange mais a du sens.
Pour répondre plus précisément à votre question, il faudrait récupérer quelque part l'exception potentiellement levée dans wait() et terminer (ou pas d'ailleurs, c'est à celui qui reçoit ce flag d'en décider).
Est-ce plus clair?
L'intérêt de cela (car il y en a un) est de ne pas provoquer brutalement la terminaison de thread qui seraient dans l'incapacité de relâcher des ressources qu'elles ont réservées... Bref, et j'aurais du le dire plus tôt, cela semble étrange mais a du sens.
Pour répondre plus précisément à votre question, il faudrait récupérer quelque part l'exception potentiellement levée dans wait() et terminer (ou pas d'ailleurs, c'est à celui qui reçoit ce flag d'en décider).
Est-ce plus clair?
Sujets similaires
» Question sur le TP5
» Question de programmation
» Question sur le partiel
» TME Exercice 6 Question 4
» Question sur le TME solo
» Question de programmation
» Question sur le partiel
» TME Exercice 6 Question 4
» Question sur le TME solo
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|