[JAVA] thread etat
Jip
-
Jip -
Jip -
Bonjour,
je suis occupé à découvrir les thread en java et je ne comprend pas vraiment l'état RUNNABLE, car d'après ce que j'ai compris un thread n'est dans cet état que lorsque c'est à son tour de s'exécuter et il devrait être BLOCKED si l'ordonnanceur a donné la main à a un autre thread, or si je teste ce code
je me retrouve parfois avec un "run dans B -> A = RUNNABLE"
Si quelqu'un pouvait m'éclairer la dessus :)
Merci !
je suis occupé à découvrir les thread en java et je ne comprend pas vraiment l'état RUNNABLE, car d'après ce que j'ai compris un thread n'est dans cet état que lorsque c'est à son tour de s'exécuter et il devrait être BLOCKED si l'ordonnanceur a donné la main à a un autre thread, or si je teste ce code
class Test extends Thread{
Thread thread;
Test(String s){
super(s);
}
Test(String s, Thread t){
super(s);
thread = t;
}
public void run(){
System.out.println("debrun "+getName()+" = "+getState());
for(int i = 0; i < 1000; i++){
System.out.println("run "+getName()+" = "+getState());
if(thread!=null) System.out.println("run dans "+getName()+" -> "+thread.getName()+" = "+thread.getState());
}
}
public static void main(String[] args){
Test a = new Test("A");
Test b = new Test("B", a);
a.start();
b.start();
}
}
je me retrouve parfois avec un "run dans B -> A = RUNNABLE"
Si quelqu'un pouvait m'éclairer la dessus :)
Merci !
1 réponse
-
RUNNABLE c'est quand le thread est en train de s'exécuter, donc à chaque fois que tu as this.getState() tu obtiendras RUNNABLE puisque le fait que tu appelles la méthodes signifie que le thread est en action. En revanche quand tu fais thread.getState tu ne devrais avoir RUNNABLE uniquement si thread==this parce que sinon cela signifierai que les deux threads différents s'exécutent en même temps ce qui n'est pas possible.
-
Oui, j'avais donc pas compris a l'envers :p
mais lors de l'exécution j'obtiens bienrun A = RUNNABLE run A = RUNNABLE run B = RUNNABLE run dans B -> A = RUNNABLE <-------------- run B = RUNNABLE run dans B -> A = RUNNABLE run B = RUNNABLE run dans B -> A = BLOCKED run B = RUNNABLE
est ce possible que le second thread s'exécute simultanément sur un autre coeur de mon processeur ou la JVM fait abstraction de ça ? -
Bon après quelque recherches je suis tombé la dessus
http://www.ukonline.be/programmation/java/tutoriel/concurrence/chapitre1/page3.php
qui nous explique qu'un thread a un état RUNNABLE et un RUNNING qui sont tous deux traduit par RUNNABLE lors de l'appel de getState().
Donc si c'est bien le cas ce n'est plus le fait que j'ai deux trois
"run dans B -> A = RUNNABLE"
qui s'affiche qui me dérange, mais pourquoi j'ai autant de
"run dans B -> A = BLOCKED"
étant donnée que mon thread A n'attend aucune ressource du thread B, je ne vois pas pourquoi il se met "BLOCKED" -
-
Je suis désolé d'insister mais c'est toujours pas clair :)
Dans ce que tu me dis je comprends que dès qu'un thread a la main, tous les autres sont BLOCKED or dans mon exemple je constate que "parfois" mon thread en attente est toujours RUNNABLE(meme si la proportion de RUNNABLE est très faible)
J'ai d'ailleurs continué à chercher un peu et dans "penser en java" je trouve ceciRunnable: Cela signifie qu'un thread peut tourner quand le mécanisme de découpage du temps a des cycles CPU disponibles pour le thread. Ainsi, le thread pourra ou non tourner, mais il n'y a rien pour l'empêcher de tourner si le scheduler peut l'organiser; il n'est ni mort ni bloqué.
et dans dans ma class Test il me semble que la seule chose que mon thread A attend c'est que l'ordonnanceur lui rende la main, donc si je me fie à cet extrait il devrait toujours être RUNNABLE puisqu'il ne partage aucune ressource, n'attend pas d'I/O etc... -
On efface tout et on recommence, j'ai moi même pu mal comprendre comment ça marchait ;-)
Je me réfère à la documentation de Thread.State :
RUNNABLE Thread state for a runnable thread. A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor.
Effectivement, tous tes threads devraient être RUNNABLE, même s'ils ne sont pas tous en cours d'exécutions par la JVM, mais :
BLOCKED Thread state for a thread blocked waiting for a monitor lock. A thread in the blocked state is waiting for a monitor lock to enter a synchronized block/method or reenter a synchronized block/method after calling Object.wait.
La méthode System.out.println est synchronisée !
En conséquence, si B est en train de faire son affichage, A est bloquée et ne peut pas le faire en même temps (sinon on aurait des lignes qui se mélangeraient) et inversement B peut-être bloquée si A est en train de faire son affichage au même moment.
-