簡體   English   中英

如何在Java中使用wait()/ notify()

[英]How to use wait()/notify() in Java

我知道有關於這個主題的一些線程是開放的,但我只是在尋找一個如何在Java中使用wait()和notify()的非常簡單的例子。 通過“非常元素”,我的意思是簡單地打印出來。 謝謝。

編輯:這是我到目前為止嘗試過的,我得到一個IllegalMonitorStateException:

 public void waiting() { for(int i = 0; i < 10; i++) { if(i == 5) try { this.wait(); } catch (InterruptedException e) { } else System.out.println(i); } System.out.println("notify me now"); this.notify(); } 

等待和通知在同步塊中使用,同時使用線程掛起並從中斷處繼續。

等待立即失去鎖定,而Nofity僅在遇到結束括號時才會離開鎖定。

public class Mythread implements Runnable{



public synchronized void goo(){

System.out.println("Before Wait");

wait();

System.out.println("After Wait");


}


public synchronized void foo(){

System.out.println("Before Notify");

notify();

System.out.println("After Notify");

}


public class Test{

public static  void main(String[] args){

Thread t = new Thread(new Mythread);

t.start();

 }
}

您的IllegalMonitorStateException是由於您必須在調用wait或notify之前同步對象。 所以

this.wait

需要是

   synchronized(this) {
      this.wait();
    }

您的示例將無法運行,因為您永遠不會進入notify調用...一旦您的線程等待,它將暫停並不再前進。 要使wait / notify工作,您必須有兩個線程。 一個線程在調用wait方法時掛起,最終,第二個線程調用synchronized(this) { this.notify() }以使第一個線程喚醒並在等待調用下繼續執行。

同步是必需的,因為您通常會在等待之前檢查某些條件,即

  synchronized(this) { 
      if(! this.isReady) {
         this.wait(); 
      }
   }

您需要進行同步以確保沒有其他線程更改檢查變量的行與您等待的行之間的isReady標志的狀態。 所以你的通知代碼會

   synchronized(this) {
      isReady = true;
      this.notify();
   }

現在方法調用的順序無關緊要。 如果你先通知,沒有線程會被喚醒,但沒關系,因為你不會睡覺因為isReady = true。 如果你先睡覺,isReady = true什么也不做,但是通知調用會喚醒線程。 最后,同步確保您不檢查線程A中的變量,然后讓線程B設置變量並通知(什么也不做),然后讓線程A進入休眠狀態並且永遠不會喚醒。

希望有所幫助。

wait()notify()用於同步線程:一個線程可以告訴wait() ,並且在收到notify()調用之前不會繼續執行任何操作。

這些函數的基本思想是wait()掛起一個線程(讓它進入休眠狀態),而notify()使線程在它進入休眠狀態時從它離開的地方獲取。

看一下: 這個或者只是在google上查找simple prodcuer consumer problem java 我相信你會找到適合你需求的東西。

在oracle java站點的受保護塊上查看此示例 - 它包含一個簡單的生產者 - 消費者問題的工作示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM