[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 !
A voir également:
- [JAVA] thread etat
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Eclipse java - Télécharger - Langages
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.
mais lors de l'exécution j'obtiens bien
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 ?
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"
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 ceci
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...
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.