執行緒間通訊

2021-08-16 12:45:44 字數 2187 閱讀 8132

一、等待/通知(wait/notify)機制的實現

1、等待(wait)

1.1、作用:使當前執行**的執行緒進行等待。

1.2、wait()方法是object類的方法。而不是thread的方法。

1.3、該方法用來將當前執行緒置於「預執行佇列」中,並且在wait()所在的**行處停止執行,直到接到通知或被中斷為止。

1.4、在呼叫wait()之前,執行緒必須獲得該物件的物件級別鎖,即只能在同步方法或同步塊中呼叫wait()方法

1.5、在執行wait()方法後,當前執行緒釋放鎖。

1.6、如果呼叫wait()時沒有持有適當的鎖,則丟擲illegalmonitorstateexception。

public

class run

}catch(interruptedexception e)

}}

二、通知(notify)

2.1、notify()方法也要在同步方法或同步塊中呼叫,即在呼叫前,執行緒也必須獲得該物件的物件級別鎖

2.2、如果呼叫notify()時沒有持有適當的鎖,也會丟擲illegalmonitorstateexception。

2.3、用來通知那些可能等待該物件的物件鎖的其他執行緒(注意:是同乙個物件鎖)。如果有多個執行緒等待,則由執行緒規劃器隨機挑選其中乙個呈wait狀態的執行緒,對其發出通知notify,並使它等待獲取該物件的物件鎖。

//等待執行緒

public

class

mythread1

extends

thread

public

void

run()

}catch (interruptedexception e)

}}//通知執行緒

public

class

mythread2

extends

thread

public

void

run()

}catch (interruptedexception e)

}}//主線程

public

class

run catch(interruptedexception e)

}}

注意:

1、在執行notify()方法後,當前執行緒不會馬上釋放該物件鎖,呈wait狀態的執行緒也並不能馬上獲取該物件鎖。

2、等到notify()方法的執行緒將程式執行完,也就是退出synchronized**塊後,當前執行緒才會釋放鎖。而呈wait狀態所在的執行緒才可以獲取該物件鎖。

3、當第乙個獲得該物件鎖的wait執行緒執行完畢後,它會釋放掉該物件鎖。此時如果該物件沒有再次使用notify語句,即便該物件是空閒的,其他wait狀態等待的執行緒由於沒有得到該物件的通知,還會繼續阻塞在wait狀態,直到這個物件發出乙個notify或notifyall(也就是物件的wait,必須由該物件的notify喚醒,即使該物件是空閒狀態也不能被獲取)。

notify操作可以喚醒乙個因呼叫了wait操作而處於阻塞狀態中的執行緒,使其進入就緒狀態。被重新喚醒的執行緒會試圖重新獲得臨界區的控制權,也就是鎖,並繼續執行臨界區內wait之後的**。如果發出notify操作時沒有處於阻塞狀態中的執行緒,那麼該命令會被忽略。

wait()方法可以使呼叫該方法的執行緒釋放共享資源的鎖,然後從執行狀態退出,進入等待佇列,直到被再次喚醒。

notify()方法可以隨機喚醒等待佇列中等待同一共享資源的「乙個」執行緒,並使該執行緒退出等待佇列,進入可執行狀態,也就是notify方法僅通知乙個執行緒。

notifyall()方法可以使所有正在等待佇列中等待同一共享資源的全部執行緒從等待狀態退出,進入可執行狀態。此時,優先順序最高的那個執行緒最先執行,也有可能是隨機執行。

wait(long) :等待某一時間內是否有執行緒對鎖進行喚醒,如果超過這個時間則自動喚醒。

執行緒間通訊

執行緒間通訊 多個執行緒在操作統一資源,但各個執行緒操作的動作不同。資源 class res class input implements runnable public void run else x x 1 2 class output implements runnable public vo...

執行緒間通訊

執行緒間的通訊 在乙個多執行緒的應用程式中,所有執行緒共享程序資源,協同工作。所以,執行緒之間的通訊是編寫多執行緒 應用的必不可少的環節。執行緒之間的通訊包括互斥 同步等,它是多 執行緒設計中最難控制的部分,也是關鍵部分。執行緒間的互斥 1 臨界區 在乙個多執行緒 的應用程式中,可能存在這樣的危險 ...

執行緒間通訊

執行緒間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同。等待喚醒機制 wait notify 0 notifyall 都使用在同步中,因為要對持有監視器 鎖 的執行緒操作。所以要使用在同步中,因為只有同步才具有鎖 為什麼這些操作執行緒的方法要定義object類中呢?因為這些方法在操作同...