Angenommen, es werden zwei Threads ausgeführt, und der Code, der von einem Thread ausgeführt wird, enthält eine tote Schleife wie: while (true) ... Wenn der Thread den Code in der Zeit ausführt (wahr), hat der andere Thread die Möglichkeit, auszuführen?
Beispielcode (Code stammt aus dem Internet)
public class Service {Object Object1 = new Object (); public void methoda () {synchronized (Object1) {System.out.println ("methoda begin"); boolean iscontinUerun = true; // Hier eine tote Schleife ausführen, während (iscontinUerun) {} System.out.println ("methoda end"); }} Object Object2 = new Object (); public void methodb () {synchronized (Object2) {System.out.println ("methodb begin"); System.out.println ("methodb end"); }}} Die Implementierung der beiden Thread -Klassen lautet wie folgt:
Service import.Service; öffentliche Klasse Threada erweitert Thread {privater Service; public threada (Service Service) {Super (); this.service = service; } @Override public void run () {Service.Methoda (); }} Thread A führt methoda () aus, und es gibt eine tote Schleife in methoda ()
service.service; public class thread erweitert Thread {private Service Service; public Taunt (Service Service) {Super (); this.service = service; } @Override public void run () {Service.Methodb (); }}Thread B führt methodb () aus. Wenn Thread A in die tote Schleife in methoda () eingeht, kann Thread B ausführen und abgeschlossen werden?
Testklasse
service.service; importe exthread.threada; importe exthread.threadb; public class run {public static void main (String [] args) {Service Service = new Service (); Threada tead = new threada (service); ithread.start (); Threadb bthread = neuer Turnier (Service); BThread.Start (); }}Da die von Thread A und Thread B erhaltene Objektschloss nicht das gleiche Schloss sind, kann aus dem Ergebnis ersichtlich sind, dass Thread B ausgeführt und abgeschlossen werden kann. Da Thread A in die tote Schleife eingeht, führt ein Thread A weiter aus und wird ausgeführt (das gesamte Programm ist nicht beendet), aber Thread B endet.
Das heißt, obwohl Thread A immer ausgeführt wird, muss er die CPU aufnehmen. Die Thread -Planung liegt jedoch in der Verantwortung des JVM oder des Betriebssystems. Es bedeutet nicht, dass Thread A ständig schleifen, während Thread B die CPU nicht besetzt. Für Thread A entspricht es einem "rechenintensiven" Job. Wenn unsere while -Schleife kontinuierlich testet, ob eine bestimmte Bedingung wahr ist, ist diese Methode eine CPU -Verschwendung. Sie können sich auf ein bestimmtes Beispiel beziehen: "Kommunikationsmethode" Inter-Thread "in der Kommunikationsmethode zwischen den Threads des Java-Multi-Thread-Java-Punktes des zweiten Punktes" Inter-Thread Communication Method "während der Umfrage.
Wenn Service.java wie folgt geändert wird:
public class Service {// Object Object1 = new Object (); public void methoda () {synchronized (this) {System.out.println ("methoda begin"); boolean iscontinUerun = true; // Hier eine tote Schleife ausführen, während (iscontinUerun) {} System.out.println ("methoda end"); }} // Object Object2 = new Object (); public void methodb () {synchronized (this) {System.out.println ("methodb begin"); System.out.println ("methodb end"); }}}Wenn Faden A zuerst die Objektsperrung erhält, befindet sich der Gewinde A immer in der WHE -Schleife aufgrund der while -Schleife. Thread B kann methodb () nicht ausführen, da es das Schloss nicht erhalten kann.
Es ist ersichtlich, dass, wenn ein Thread nicht in der synchronisierten Methode beendet ist und die Sperre nicht loslassen kann, der andere Faden nur unendlich warten kann.
Das obige dreht sich alles um diesen Artikel. Ich hoffe, es wird für alle hilfreich sein, Java Multithreading zu lernen.