3 1等待 通知機制(wait notify)

2021-07-09 12:20:56 字數 3152 閱讀 7333

要點

wait()

執行前在呼叫wait()之前,必須先要獲得物件鎖,即只有在同步方法或者同步**塊中呼叫wait()方法。

執行作用

wait()使程序進入等待(阻塞狀態),在收到通知或者被中斷之前都會進入預執行佇列。

執行之後1

執行wait()之後,當前執行緒釋放改物件鎖,在通知前與其他執行緒重新競爭資源

執行之後2

執行wait()之後,如果沒有使用notify()通知其他執行緒,即使該物件資源空閒,其他使用過wait()執行緒由於沒有通知會繼續阻塞直到這個物件發出notify或者notifyall

/wait()是object物件的方法。 要點

notify()

執行前在呼叫notify()之前,必須先要獲得物件鎖,即只有在同步方法或者同步**塊中呼叫notify()方法。

執行作用

通知乙個等待該物件資源的執行緒進入就緒狀態,如果有多個執行緒等待,怎有執行緒規劃器來挑選乙個進入就緒狀態(區別notify和notifyall)

執行之後

執行notify之後,當前執行緒並不會立即釋放鎖,只有當執行完sychronized方法或者**塊的時候,當前執行緒才會釋放鎖

/notify()是object物件的方法。

針對上面的鎖釋放不釋放,來做乙個小的例子

先做wait()之後鎖立即釋放

package com.myobject;

public

class object1 catch (interruptedexception e) }}

}

package com.mythread;

import com.myobject.object1;

public

class

thread1a

extends

thread

@override

public

void

run()

}

package com.mythread;

import com.myobject.object1;

public

class

thread1b

extends

thread

@override

public

void

run()

}

package com.test;

import com.mythread.thread1a;

import com.mythread.thread1b;

public

class test1

}

列印結果

wait begin

wait begin

下面是驗證notify()之後鎖不立即釋放

package com.myobject;

public

class object1 catch (interruptedexception e) }}

public

void

mothd2(object lock) catch (interruptedexception e) }}

}

package com.mythread;

import com.myobject.object1;

public

class

thread1a

extends

thread

@override

public

void

run()

}

package com.mythread;

import com.myobject.object1;

public

class

thread1b

extends

thread

@override

public

void

run()

}

package com.test;

import com.mythread.thread1a;

import com.mythread.thread1b;

public

class test1

}

列印結果

a wait begin 1453090470087

bnotify begin 1453090471088

bnotify end 1453090476088

a wait end 1453090476088

說明notify必須在執行完synchronized同步方法或者同步**塊之後才釋放鎖

package com.myobject;

public

class object2 catch (interruptedexception e) }}

}

package com.mythread;

import com.myobject.object2;

public

class

thread2

extends

thread

@override

public

void

run()

}

package com.test;

import com.mythread.thread2;

public

class test2

}

當執行緒處於wait()時,呼叫執行緒物件的interrupt()會出現interruptedexception

總結:釋放鎖的時刻有

1)同步**完成

2)丟擲異常或者return

3)wait()方法

11 等待 通知(wait notify)機制介紹

1.當兩個執行緒主動地讀取乙個共享變數時,在花費讀取時間的基礎上,讀取到的值是不是想要的,並不能完全確定,等待 通知 機制就用來滿足這樣的需求。2.wait 的作用是使當前執行的執行緒進行等待。呼叫之前要獲取物件級別鎖,即只能在同步方法中或者同步塊中呼叫。執行wait 方法後,當前執行緒釋放鎖,在從...

《多執行緒程式設計》學習之七 等待 通知機制(一)

今天起開始學習執行緒之間的通訊。等待 通知機制是通過object類的wait 與notify 方法來實現的,這兩個方法在同步方法或同步 塊中才能被執行。wait 方法將當前執行緒放入 等待執行佇列 中,使執行緒在wait 方法所處 處停止執行,直到被喚醒或者被中斷為止,執行wait 方法會釋放物件鎖...

等待 通知機制

waitnotify模式的注意事項 經典案例生產者消費者模式實現 實戰等待通知之交叉備份 舉例說明,廚師和服務員之間的互動 1.廚師做完一道菜的時間不確定,所以廚師將菜品放到 菜品傳遞臺 上的時間也不確定 2.服務員取到菜的時間取決於廚師,所以服務員就處於等待狀態 3.服務員如何取到菜呢?又得取決於...