Programmation Concurrente (2016)


Rejoignez le forum, c’est rapide et facile

Programmation Concurrente (2016)
Programmation Concurrente (2016)
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
-20%
Le deal à ne pas rater :
Ecran PC GIGABYTE 28″ LED M28U 4K ( IPS, 1 ms, 144 Hz, FreeSync ...
399 € 499 €
Voir le deal

Question sur wait()

2 participants

Aller en bas

Question sur wait() Empty Question sur wait()

Message par Heros 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

Revenir en haut Aller en bas

Question sur wait() Empty Re: Question sur wait()

Message par Admin 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 : 55
Join date : 24/08/2016

https://3i001-2016.forumactif.org

Revenir en haut Aller en bas

Question sur wait() Empty Re: Question sur wait()

Message par Heros 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

Revenir en haut Aller en bas

Question sur wait() Empty Re: Question sur wait()

Message par Admin 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 : 55
Join date : 24/08/2016

https://3i001-2016.forumactif.org

Revenir en haut Aller en bas

Question sur wait() Empty Re: Question sur wait()

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

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