Подробное объяснение и примеры Java Thread Sleep () и Wait ()
спать
1. Sleep - это статический метод потока. Это позволяет потокам, реализованным Runnable, использовать метод сна. Это также позволяет избежать вызова () метода друг другу перед потоками, чтобы вызвать тупики.
2. Sleep () нужно дать время сна при выполнении. Во время сна (во время блокировки) процессор отказатся от этой нити и выполнит другие задачи. Когда время сна истекает, поток автоматически проснется, но поток не будет выполнен немедленно, но будет ждать, пока ЦП распределяет ресурсы, чтобы конкурировать с другими потоками.
3. Кроме того, если эта поток приобретает замок ранее, замок не будет выпущен во время сна. Другие программы, ожидающие этой блокировки машины, должны ждать, пока этот поток проснется и запустит после выполнения.
Код, связанный со сном
public class threadtest2 {public static void main (string [] args) {System.out.println («Начать наш тест»); Threadsleep Sleep = new Threadsleep (); try {Thread Thread1 = новый поток (Sleep, "прохожие A"); Thread Think2 = новый поток (Sleep, «прохожие B»); Thread1.start (); Thread2.start (); } catch (Exception e) {e.printstackTrace (); } System.out.println ("Тест закончен"); }} класс Threadsleep Sleeps Runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "Скажи: Привет, сон !!"); считать(); } public void count () {while (count <20) {System.out.println (thread.currentThread (). getName () + "SAID: count" + count); попробуйте {count ++; Thread.sleep (100); } catch (Exception e) {e.printstackTrace (); }}}}Выходной журнал
Начнется наш тестовый тест над проходом A говорит: Привет, сон !! Прохожий A говорит: счет: 0 прохожих B говорит: Привет, сон !! Прохожий B говорит: граф - это 1 прохожий A, который говорит: Count - это 2 прохожих B говорит: Count - это 2 прохожих As говорит: Count - это 4 прохожих B говорит: Count 4 Shorserby A говорит: Count 6 Shorserby B говорит: Count 7 Shoaderby B говорит: граф 8 -то прохожие A: Count - это 8 прохожи Прохожий B говорит: граф 14 прохожих A говорит: граф 14 прохожих A говорит: граф 16 прохожих B говорит: граф - 16 прохожих A говорит: граф - это 18 прохожих B говорит: Count - это 18
Через журнал мы можем обнаружить, что поток A и поток B в основном выполняются попеременно, но они нерегулярны и имеют проблемы с параллелизмом.
Эта ситуация связана с тем, что код устанавливает время сна до 100 миллисекунд. Поскольку скорость выполнения счетов очень быстрая, нить почти спит одновременно, а затем просыпается одновременно и вызывает одновременное происхождение.
Далее вам нужно добавить блок синхронизации, чтобы проверить, выпущен ли блокировка времени сна время сна
public class threadtest2 {public static void main (string [] args) {System.out.println («Начать наш тест»); Threadsleep Sleep = new Threadsleep (); try {Thread Thread1 = новый поток (Sleep, "прохожие A"); Thread Think2 = новый поток (Sleep, «прохожие B»); Thread1.start (); Thread2.start (); } catch (Exception e) {e.printstackTrace (); } System.out.println ("Тест закончен"); }} класс Threadsleep Sleeps Runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "Скажи: Привет, сон !!"); считать(); } public void count () {while (count <20) {synchronized (this) {System.out.println (thread.currentThread (). getName () + "SAID: count" + count); попробуйте {count ++; Thread.sleep (100); } catch (Exception e) {e.printstackTrace (); }}}}}}Выходной журнал
Начните наш тестовый прохожие, говорит: Привет, сон !! Прохожий A говорит: граф о 0 -тесте над прохожим B говорит: Привет, сон !! Прохожий A говорит: граф - это 1 прохожие прохожие A: Count - это 2 прохожих A говорит: граф - это 3 прохожих A говорит: граф - это 4 прохожих Ase: Count - это 5 прохожих A говорит: граф - 6 прохожих A говорит: Count 7 Shoaderby A говорит: граф составляет 8 прохожи 13 Пассер A говорит: Count-это 14 пассажиров A говорит: Count-15-Passer A говорит: граф 16-пассажир A говорит: Count-это 17-пассажир A говорит: Count-это 18-пассажир A говорит: Count-19-Passer B говорит: Count-20-20
Это видно из журнала, который в основном выполняет поток A. Это связано с тем, что во время сна блокировка машины всегда находится на потоке A, поэтому резьба B может подождать только, пока нить не выпустит блокировку.
ждать
1. wait () - это метод класса объекта. Когда метод wait () вызывается, поток входит в пул ожидания, связанный с объектом, и выпускает блокировку, которую он имеет.
2. После выполнения wait () вы должны использовать метод notify () или notifyall () или установить время ожидания (подождите (долго)), чтобы разбудить поток в пуле резьбы ожидания.
3. wait () должен быть размещен в синхронизированном блоке, в противном случае исключение «java.lang.illegalmonitorstateexception» будет сообщено во время выполнения.
Код, связанный с ожиданием
public class threadtest2 {public static void main (string [] args) {System.out.println («Начать наш тест»); Threadsleep Sleep = new Threadsleep (); try {Thread Thread1 = новый поток (Sleep, "Passman A"); Thread Think2 = новый поток (Sleep, "Passman B"); Thread1.start (); Thread2.start (); } catch (Exception e) {e.printstackTrace (); } System.out.println ("Тест закончен"); }} класс Threadsleep Sleeps Runnable {int count = 0; @Override public void run () {System.out.println (thread.currentThread (). GetName () + "SAKE: Hello Sleep !!"); считать(); } public void count () {while (count <20) {synchronized (this) {System.out.println (thread.currentThread (). getName () + "SAID: count" + count); попробуйте {count ++; это. wat (100); } catch (Exception e) {e.printstackTrace (); }}}}}}Выходной журнал
Начните наш тестовый прохожие, говорит: Привет, сон !! Прохожий A говорит: граф о 0 -тесте над прохожим B говорит: Привет, сон !! Прохожий B говорит: граф - это 1 прохожие А. А. говорит: граф - это 2 прохожих Б, говорит: граф - это 3 прохожих А. говорит: граф - это 4 прохожих Б говорит: граф - это 5 прохожих, говорит: граф - 6 прохожих B говорит: граф - это 7 прохожих Aserb Прохожий B говорит: граф 14 прохожих A говорит: Count - 15 прохожих B говорит: Count 16 прохожих A говорит: граф - 17 прохожих B говорит: граф - это 18 прохожих A говорит: граф - это 19
Через журнал можно обнаружить, что в случае ожидания замок будет выпущен.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!