Programmation Concurrente (2016)

Question sur wait()

Voir le sujet précédent Voir le sujet suivant Aller en bas

Question sur wait()

Message par Heros le Dim Oct 08, 2017 2:22 pm

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

Heros

Posts : 12
Join date : 08/09/2017

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Question sur wait()

Message par Admin le Dim Oct 08, 2017 6:23 pm

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?

Admin
Admin

Posts : 47
Join date : 24/08/2016

Voir le profil de l'utilisateur http://3i001-2016.forumactif.org

Revenir en haut Aller en bas

Re: Question sur wait()

Message par Heros le Dim Oct 08, 2017 6:43 pm

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

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Question sur wait()

Message par Admin le Dim Oct 08, 2017 7:03 pm

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?

Admin
Admin

Posts : 47
Join date : 24/08/2016

Voir le profil de l'utilisateur http://3i001-2016.forumactif.org

Revenir en haut Aller en bas

Re: Question sur wait()

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum