2012-07-17 98 views
4

我知道有一些關於這個主題的線程已經打開,但我只是在尋找一個非常基本的如何使用wait()和notify()的例子。在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(); 
} 

+0

請注意,notify()喚醒1個線程,而notifyAll()喚醒等待給定對象的所有線程。 – 2012-07-17 16:42:31

回答

3

等待和通知在同步塊中使用,同時使用線程暫停和恢復在哪裏停止。

等待立即失去鎖定,而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(); 

} 
} 
+0

這有幫助,謝謝! – jrad 2012-07-18 19:38:44

+0

歡迎您觀看 – 2012-07-19 04:17:35

+0

@jrad如何使用?你的意思只是使用'wait()'/'notify()'的機制?看起來,你想知道什麼時候使用'wait()'/'notify()'vis-a-vis' synchronized'? – overexchange 2017-09-27 21:53:10

1

wait()notify()用於同步線程:一個線程可以告訴wait(),而不會繼續做任何事情,直到它收到notify()電話。

+0

是的,但我正在尋找一個例子。 – jrad 2012-07-17 16:00:36

+1

@JackRadcliffe你有嘗試過什麼嗎? – 2012-07-17 16:01:25

+0

是的,我已將它添加到原始帖子。 – jrad 2012-07-17 16:03:53

0

這些函數的基本思想是wait()掛起一個線程(使其進入睡眠狀態),並且notify()會使線程在它進入睡眠狀態時在其離開的位置拾取它。

0

看一看:this或只是在谷歌上查找simple prodcuer consumer problem java。我相信你會找到適合你需求的東西。

2

你拋出:IllegalMonitorStateException是由於這樣的事實,你必須調用wait之前在對象上同步或通知。所以

this.wait

需求是

synchronized(this) { 
     this.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進入休眠狀態並且永不醒來。

希望有所幫助。

相關問題