Предположим, что есть два потока, работающие одновременно, и код, выполненный одним потоком, содержит мертвый цикл, такой как: while (true) ... Когда поток выполняет код в while (true), будет ли другой поток шанс выполнить?
Пример кода (код происходит из Интернета)
Общедоступный класс Service {Object Object1 = new Object (); public void methoda () {synchronized (object1) {System.out.println ("methoda begin"); логический iscontinuerun = true; // Выполните мертвый цикл здесь while (iscontinuerun) {} system.out.println ("methoda end"); }} Объект объект2 = new Object (); public void methodb () {synchronized (object2) {system.out.println ("methodb begin"); System.out.println ("methodb end"); }}} Реализация двух классов потоков следующая:
Import Service.service; публичный класс Threada Extends Thread {Private Service Service; public Threata (Service Service) {super (); this.service = service; } @Override public void run () {service.methoda (); }} Потока a exection methoda (), и в methoda () есть мертвая петля ()
Import Service.service; открытый класс Threatb Extends Thread {Private Service Service; public Thintb (Service Service) {super (); this.service = service; } @Override public void run () {service.methodb (); }}Поток B выполняет MethodB (). Когда резьба входит в тупик Dead Loop в methoda (), может ли поток B выполнить и завершить?
Тестовый класс
import service.service; import extthread.threada; import extthread.threadb; public class run {public static void main (string [] args) {service service = new Service (); Threata athread = new Threada (Service); athread.start (); ThreatB BTHREAD = NEW THITEB (SERVICE); bthread.start (); }}Поскольку блокировка объекта, полученная потоком A и потоком B, не является одинаковой блокировкой, можно увидеть из результата, что поток B может быть выполнен и завершен. Поскольку потока A входит в Dead Loop, поток A продолжает выполнять и запустить (вся программа не закончилась), но поток B закончится.
То есть, хотя поток A всегда выполняется, в то время как он должен занять процессор. Тем не менее, планирование потоков является обязанностью JVM или операционной системы. Это не означает, что нить A постоянно зацикливается, а затем нить B не будет занимать процессор. Для потока A он эквивалентен «вычислению». Если наша цикл непрерывно проверяет, является ли определенное условие истинным, то этот метод является пустой тратой процессора. Вы можете обратиться к конкретному примеру: «Межпоточный метод связи» в методе связи между потоками Java многопоточной точки Java «Межпоточный метод связи» во время опроса.
Если Service.java изменяется следующим образом:
Общедоступный класс Service {// Object Object1 = new Object (); public void methoda () {synchronized (this) {System.out.println ("methoda begin"); логический iscontinuerun = true; // Выполните мертвый цикл здесь while (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"); }}}Если резьба A получает сначала блокировку объекта, резьба A всегда находится в цикле while из -за цикла while. Поток B не может выполнить methodb (), потому что он не может получить блокировку.
Можно видеть, что если один поток не может выйти в синхронизированный метод и не может освободить блокировку, другой поток может ждать только бесконечно.
Выше всего об этой статье. Я надеюсь, что всем будет полезно изучить многопоточную чтения Java.