1. 程式人生 > >java的 wait 和 notify 機制

java的 wait 和 notify 機制

通常,多執行緒之間需要協調工作。例如,瀏覽器的一個顯示圖片的執行緒displayThread想要執行顯示圖片的任務,必須等待下載執行緒 downloadThread將該圖片下載完畢。如果圖片還沒有下載完,displayThread可以暫停,當downloadThread完成了任務 後,再通知displayThread“圖片準備完畢,可以顯示了”,這時,displayThread繼續執行。
以上邏輯簡單的說就是:如果條件不滿足,則等待。當條件滿足時,等待該條件的執行緒將被喚醒。在Java中,這個機制的實現依賴於wait/notify。等待機制與鎖機制是密切關聯的。例如:
synchronized(obj) {while(!condition) {obj.wait();}obj.doSomething();}  

當執行緒A獲得了obj鎖後,發現條件condition不滿足,無法繼續下一處理,於是執行緒A就wait()。
在另一執行緒B中,如果B更改了某些條件,使得執行緒A的condition條件滿足了,就可以喚醒執行緒A:
synchronized(obj) {condition = true;obj.notify();} 

需要注意的概念是:
◆呼叫obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫在synchronized(obj) {...} 程式碼段內。
◆呼叫obj.wait()後,執行緒A就釋放了obj的鎖,否則執行緒B無法獲得obj鎖,也就無法在synchronized(obj) {...} 程式碼段內喚醒A。
◆當obj.wait()方法返回後,執行緒A需要再次獲得obj鎖,才能繼續執行。
◆如果A1,A2,A3都在obj.wait(),則B呼叫obj.notify()只能喚醒A1,A2,A3中的一個(具體哪一個由JVM決定)。
◆obj.notifyAll()則能全部喚醒A1,A2,A3,但是要繼續執行obj.wait()的下一條語句,必須獲得obj鎖,因此,A1,A2,A3只有一個有機會獲得鎖繼續執行,例如A1,其餘的需要等待A1釋放obj鎖之後才能繼續執行。
◆當B呼叫obj.notify/notifyAll的時候,B正持有obj鎖,因此,A1,A2,A3雖被喚醒,但是仍無法獲得obj鎖。直到B退出synchronized塊,釋放obj鎖後,A1,A2,A3中的一個才有機會獲得鎖繼續執行。

相關推薦

javawait notify 機制

通常,多執行緒之間需要協調工作。例如,瀏覽器的一個顯示圖片的執行緒displayThread想要執行顯示圖片的任務,必須等待下載執行緒 downloadThread將該圖片下載完畢。如果圖片還沒有下載完,displayThread可以暫停,當downloadThread完成了任務 後,再通知displayT

JAVA中的waitnotify

try object ted 並不是 阻塞 main nbsp star oid 1 package com.runnabledemo; 2 3 public class waitnotifydemo01 { 4 public static void m

Java利用waitnotify實現執行緒間通訊

       Java的Object類提供了wait和notify方法用於實現執行緒間通訊(因為所有的java類都繼承了Object類,所以所有的java類都有這兩個方法)。這兩個方法在Object類中籤名如下: pu

javawaitnotify練習

寫兩個執行緒,一個執行緒列印 1~52,另一個執行緒列印A~Z, 列印順序是12A34B...5152Z; class Print{ private int i=1; private char j='A'; public synchronized

java執行緒waitnotify 筆記理解

首先明確 兩個的概念: wait()方法是暫停使用當前鎖執行的執行緒,並釋放當前執行緒的資源和當前的物件鎖。 notify()方法是隨機喚醒使用當前鎖暫停的執行緒,而notifyAll()是喚醒所有的使用當前鎖暫停的執行緒 直接兩段程式碼 看看效果: 一個生產者執行緒往list新增一

JAVA執行緒中的關於waitnotify不錯的例子

JAVA執行緒中的關於wait和notify不錯的例子,原來的實現方法:   public class ListAdd1 { private volatile static List list = new ArrayList(); public void add(){

Java執行緒wait()notify()的簡單使用

package com.ThreadPool; import java.util.LinkedList; /** * 2019-1-8 * @author Administrator * */ public class Lock { public static void main(St

Java多執行緒之 使用waitnotify實現生產者消費者模型

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java執行緒中sleep()、wait()notify()notifyAll()、yield()、join()等方法的用法區別

Java執行緒中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和區別從作業系統的角度講,os會維護一個ready queue(就緒的執行緒佇列)。並且在某一

JAVAwaitnotifynotifyall

這個內容真是常學常忘啊,這次學了總結一下先: 一、wait、notify和notifyall一定要在synchronized語句塊中執行,並且synchronized的物件就是呼叫wait、notify和notifyall方法的物件。比如說下面這一對就會拋錯IllegalM

Java中通過waitnotify來實現生產者消費者模式

今天通過介紹一下如何通過wait和notify來實現生產者和消費者模式。 通過synchronized同步程式碼塊實現執行緒的同步操作,從而保證資料的一致性。下面具體介紹一下這個模式的實現過程。 1.首先編寫一個生產者類: public class Producer imp

java筆記之waitnotify的深入理解

package com.lyzx.concurrent.lock; /** * 測試wait和Notify的筆記,在看讀寫鎖原始碼時的感想, * 當很多執行緒在一個物件上等待時,呼叫該物件的not

Java多執行緒之執行緒間通訊--等待(wait)/通知(notify)機制,等待/通知之交叉備份例項

1、什麼是等待/通知機制   等待/通知機制在生活中比比皆是,比如在就餐時就會出現,如圖所示。      廚師和服務員之間的互動要在“菜品傳遞臺”上,在這期間會有幾個問題:   1).廚師做完一道菜的時間不確定,所以廚師將菜品放到‘菜品傳遞言,上的時間也

waitnotify函數的規範代碼模板

tar int ase sync 變化 ava 條件判斷 clas queue // The standard idiom for calling the wait method in Java synchronized (sharedObject) { wh

JAVA wait()notifyAll()實現線程間通訊

all row cache string runnable private sync ide cached 本例是閱讀Think in Java中相應章節後,自己實際寫了一下自己的實現 import java.util.concurrent.ExecutorService

waitnotify簡單學習

wait main oid 釋放 java let () and stat 學C的時間粗劣寫過些wait和notify的代碼,java裏接觸的時候並沒有花什麽時間學習,本質上來說並沒有區別,這兩個方法都要和鎖配合使用,java裏常見和synchronized關鍵詞配合使用,

先後有序的waitnotify

pri ava zed min star exceptio ktr 有序 () 這裏先講述 大道揚帆 裏的一個小故事 話說男豬腳揚帆駕馭一葉扁舟在碧海上飄蕩。 一只木漿在揚帆手裏上下翻飛,驚起了層層漣漪。 “把帆揚起來吧,也省些力氣。”夏夏道。 “海風還沒到(signal)

線程的通訊-----waitnotify的使用

nbsp notify not 方法 同步代碼塊 通知 wait wait方法 必須 線程通訊:一個線程完成自己任務,要通知另一個線程完成另一個任務。 wait():等待,掛起.... 如果線程執行了wait方法,那麽該線程會進入阻塞狀態,阻塞狀態下的線程必須要被其他線程

Thinking in java:RTTI反射機制

摘抄別人的一句話:要想理解反射的原理,首先要了解什麼是型別資訊。Java讓我們在執行時識別物件和類的資訊,主要有2種方式:一種是傳統的RTTI,它假定我們在編譯時已經知道了所有的型別資訊;另一種是反射機制,它允許我們在執行時發現和使用類的資訊 一.RTTI 為理解RTTI在Java裡

waitnotify方法實現執行緒間的通訊

    使用wait和notify方法實現執行緒間的通訊需要注意以下兩點: wait和notify必須配合synchronized去使用。 wait可以釋放鎖,notify不釋放鎖。 1.wait和notify的簡單應用   &nbs