Supposons qu'il y ait deux threads en cours d'exécution simultanément, et le code exécuté par un thread contient une boucle morte telle que: while (true) ... lorsque le thread exécute le code dans While (true), l'autre thread aura-t-il une chance d'exécuter?
Exemple de code (le code provient d'Internet)
classe publique Service {objet objet1 = nouveau objet (); public void methoda () {synchronisé (object1) {System.out.println ("méthody begin"); booléen iscontinuerun = true; // Exécuter une boucle morte ici while (isContinUerUn) {} System.out.println ("Methoda end"); }} Objet objet2 = new Object (); public void methodb () {synchronisé (object2) {system.out.println ("méthodeb begin"); System.out.println ("MethodB end"); }}} L'implémentation des deux classes de threads est la suivante:
Importer Service.Service; public class Threada étend Thread {SERVICE PRIVATE; public threada (service Service) {super (); this.service = service; } @Override public void run () {Service.Methoda (); }} Le thread a exécute méthoda (), et il y a une boucle morte dans Methoda ()
Importer Service.Service; public class ThreadB étend Thread {SERVICE PRIVATE; public threadb (service Service) {super (); this.service = service; } @Override public void run () {Service.Methodb (); }}Le thread B exécute MethodB (). Lorsque le thread A entre dans la boucle morte While dans Methoda (), le thread B peut-il exécuter et terminer?
Classe de test
Importer Service.Service; Importer ExtThread.Threada; Importer Extthread.Threadb; public class run {public static void main (String [] args) {Service Service = new Service (); Threada Athread = new Threada (service); Athread.start (); ThreadB bthread = new ThreadB (service); bthread.start (); }}Étant donné que le verrouillage d'objet obtenu par le thread A et le thread B ne sont pas le même verrouillage, il peut être vu à partir du résultat que le thread B peut être exécuté et terminé. Étant donné que le thread A entre dans la boucle mortelle, le thread A continue d'exécuter et d'exécuter (l'ensemble du programme n'a pas terminé), mais le thread B se terminera.
Autrement dit, bien que le thread A s'exécute toujours pendant pendant, il doit prendre le CPU. Cependant, la planification des threads est de la responsabilité du JVM ou du système d'exploitation. Cela ne signifie pas que le fil A a constamment bouclé pendant que le fil B n'occupera pas le CPU. Pour le thread A, il équivaut à un travail "à forte intensité de calcul". Si notre boucle WHOOP teste en continu si une certaine condition est vraie, alors cette méthode est un gaspillage de CPU. Vous pouvez vous référer à un exemple spécifique: "Méthode de communication inter-thread" dans la méthode de communication entre les threads du point Java Java Point Java de "Méthode de communication inter-thread" Deuxième point lors du sondage.
Si Service.java est modifié comme suit:
classe publique service {// objet objet1 = new object (); public void methoda () {synchronisé (this) {System.out.println ("Methoda Begin"); booléen iscontinuerun = true; // Exécuter une boucle morte ici while (isContinUerUn) {} System.out.println ("Methoda end"); }} // objet objet2 = nouveau objet (); public void methodb () {synchronisé (this) {System.out.println ("MethodB Begin"); System.out.println ("MethodB end"); }}}Si le thread A obtient d'abord le verrouillage de l'objet, le thread A est toujours dans la boucle while en raison de la boucle while. Le thread B ne peut pas exécuter MethodB () car il ne peut pas obtenir le verrou.
On peut voir que si un thread ne peut pas sortir dans la méthode synchronisée et ne peut pas libérer le verrou, l'autre fil ne peut qu'attendre à l'infini.
Ce qui précède concerne cet article. J'espère qu'il sera utile à tout le monde d'apprendre le multithreading Java.