/*
This should always produce 0 as output since all three methods increment(), decrement(), value() are thread safe(synchronized). but it is returning 1
*/
class Counter implements Runnable {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
public void run() {
try {
this.increment();
Thread.sleep(1000);
this.decrement();
Thread.sleep(1000);
this.increment();
Thread.sleep(1000);
this.decrement();
Thread.sleep(1000);
}
catch (InterruptedException e){
return;
}
}
public static void main(String args[]) throws InterruptedException {
Counter c = new Counter();
new Thread(c).start();
new Thread(c).start();
System.out.println(c.value());
}
}
Répondre
Vous lisez la valeur avant que les threads aient terminé l'exécution, donc il peut être bien différent de zéro.
Vous n'attendez pas l'exécution des threads, le résultat est que la valeur de c est imprimée à tout moment à la seconde. Je parie que si vous essayé 1000 fois, il y aurait des moments où il n'a pas été 1.
IBM a un tutoriel juste sur la situation que vous rencontrez: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/rzahw/rzahwex3rx.htm
Il n'y a rien à contrôler quand la principale le thread appelle value()
. Il s'exécutera dès qu'il pourra acquérir un verrou sur c
, même si les autres threads sont toujours en cours d'exécution.
Si vous souhaitez attendre que les threads soient terminés, appelez le join()
.
Comme tout le monde a dit que vous devez vous assurer que les bandes de roulement ont terminé l'exécution, pour ce faire, vous devez appeler join. par exemple
public static void main(String args[]) throws InterruptedException {
Counter c = new Counter();
Thread t1 = new Thread(c).start();
Thread t2 = new Thread(c).start();
t1.join();
t2.join();
System.out.println(c.value());
}
qui devrait fonctionner correctement
- 1. Problèmes de sortie dans le programme Java
- 2. Comment obtenir le statut de sortie d'un programme Java dans le fichier de commandes Windows
- 3. Comment obtenir une sortie d'un programme Exec dans Ino Setup?
- 4. Aide avec Java Multithreading
- 5. Java multithreading et héritage
- 6. Java Threads (multithreading)
- 7. obtenir le code de sortie pour le programme python
- 8. Accélération négative sur multithreading mon programme
- 9. Pourquoi désactiver le tampon de sortie standard lors du multithreading?
- 10. Java multithreading - détecter automatiquement thread bloqué
- 11. Obtenir une sortie de tableau en double - java
- 12. Java multithreading la lecture d'un seul fichier
- 13. lire deux fichiers lexicalisés en utilisant le multithreading en java
- 14. AS400 Java Java programme terminé avec le code de sortie 1
- 15. Démarrage d'un programme externe en Java et tuyauterie sa sortie
- 16. Supprimer le cache de sortie par programme
- 17. Obtenir le chemin du fichier dans Java
- 18. obtenir les données du fichier de commandes au programme Java
- 19. comment obtenir et définir la valeur dans un programme java
- 20. Erreur d'analyse dans le programme Java
- 21. multithreading Sémaphore
- 22. java programme doute
- 23. Comment obtenir une sortie dans Java à partir d'une procédure stockée SELECT dans Oracle?
- 24. VB.net Simple multithreading
- 25. Noob question sur une déclaration dans un programme Java
- 26. multithreading dans Flex
- 27. Sortie de tuyauterie du programme C dans le fichier (bash)
- 28. comment obtenir le chaque mot qui a la valeur maximale en utilisant le programme java
- 29. Programme multithreading client-serveur implémenté via des canaux nommés
- 30. Qu'est-ce que le multithreading?