18.等待喚醒機制(wait、notify)


 

等待喚醒機制(waitnotify

 引言

本節介紹一個和同步同步鎖都相關的知識點,等待喚醒機制。下面從3點來介紹等待喚醒機制。

第一點是當前線程等待,

第二點喚醒單個等待的線程,

第三點喚醒鎖有等待的線程。

 

 

 使當前線程等待

首先來看第一點,使當前線程等待,使用wait方法即可讓當前線程等待,

 

 

該方法只能被鎖對象調用,而鎖有對象都可以成為鎖。所以該方法就位於OBD的類里面,鎖有對象都可以調用該方法。調用該方法被中斷,則引發線程中斷異常。

 

 

下面來演示該方法。自定義一個任務,任務內容是使當前線程等待,等待之后隨便輸出一句話,但我們知道調用wait方法需要鎖,而鎖必然從同步中獲取。


所以這里我們先定義一個同步代碼塊,同步鎖為
this,這里的this指代的就是task、對象,現在鎖我們已經拿到了,下面調用鎖對象的wait方法使當前線程等待。不過wait的方法有拋異常,使用try-catch捕獲,之后隨便輸出一句話,

 

 

下面我們來執行任務,首先將任務創建出來,然后創建一個線程,接着將任務傳遞給線程,最后啟動線程。

 

 

從執行結果來看,線程的確被等待,程序未結束,

 

 喚醒單個等待的線程

第一點介紹完了。再來看第二點,喚醒單個等待的線程,使用notify方法就可以喚醒單個等待的線程。 


該方法同樣需要被鎖對象調用,也是位於
object類里面,下面使用notify方法,喚醒剛剛等待的線程,接着之前的程序寫,為了喚醒效果更明顯,使主線程休眠一秒鍾,一秒鍾之后才喚醒等待中的線程。剛剛的鎖的對象是task對象,所以這里使用task對象調用notify方法,喚醒在該鎖上等待的單個線程。不要忘了notify方法需要當前線程擁有對應的鎖才可以被調用。所以調用notify方法的語句需要寫在同步代碼塊里面,

 

 

下面來看看執行結果。從執行結果來看,一秒鍾后等待的線程被喚醒,程序結束

 

 

為證明notify方法只能喚醒單個等待的線程。 


我們再創建兩個線程,一共是三個線程在等待。

 

 

下面我們再來看看執行結果,從執行結果來看,只有一個線程被喚醒,只輸出了一句話,還有兩個線程依舊在等待,程序因還有線程未執行完而無法結束。

 

 喚醒所有等待的線程

下面我們再來介紹如何喚醒所有等待的線程,使用notifyall方法就可以喚醒所有等待的線程,該方法同樣需要被鎖對象調用,也是位於object類里面。

 

 

下面使用notifyall方法喚醒剛剛所有等待的線程,改寫之前的程序,將notify方法換成notifyall方法即可。 

 

 

 

 

 


下面再來看看執行結果,從執行結果來看,所有線程被喚醒。還輸出了三句話程序也結束了


 

 總結

最后來總結一下本節的內容。本節介紹了與同步同步鎖相關的等待喚醒機制,這里列舉了5個方法,其中前3個方法和等待相關,后2個方法和喚醒相關,wait方法的作用是使當前線程等待,它還有兩個重載方法可以指定等待超時時間,若等待超時則自動喚醒。notify方法的作用,是喚醒單個等待的線程,notifyall方法的作用是喚醒所有等待的線程,在實際開發中以上方法經常被使用。 

 

 

  

附錄:

筆記完整文本:

本節介紹一個和同步同步鎖都相關的知識點,等待喚醒機制。下面從3點來介紹等待喚醒機制。第一點是當前線程等待,第二點喚醒單個等待的線程,第三點喚醒鎖有等待的線程。首先來看第一點,使當前線程等待使用wait方法即可讓當前線程等待,該方法只能被鎖對象調用,而鎖有對象都可以成為鎖。鎖以該方法就位於OBD的類里面鎖有對象都可以調用該方法調用該方法被中斷,則引發線程中斷異常。下面來演示該方法。自定義一個任務任務內容是使當前線程等待,等待之后隨便說出一句話,但我們知道調用wait方法需要鎖,而鎖必然從同步中獲取。 鎖以這里我們先定義一個同步代碼塊,同步鎖為zs,這里的js指代的就是task、對象,現在鎖我們已經拿到了,下面調用鎖對象的wait方法使當前線程等待。不過胃的方法有Paul異常,使用踹開啟將其補后,之后隨便說出一句話,下面我們來執行任務,首先將任務創建出來,然后創建一個線程,接着將任務傳遞給scheme,最后啟動線程。從執行結果來看,線程的確被等待,程序未結束,第一點介紹完了。再來看第二點,喚醒單個等待的線程,使用裸體反應方法就可以喚醒單個等待的線程。 該方法同樣需要被鎖對象調用,也是位於object類里面下面使用not方法,喚醒剛剛等待的縣城,接着之前的程序寫,為了喚醒效果更明顯,使主線程休眠一秒鍾,一秒鍾之后才喚醒等待中的線程。剛剛的,手對象是task對象,鎖以這里使用task對象調用落體法方法,喚醒在該鎖上等待的三個,縣城不要忘了Lotty five方法需要當前線程擁有對應的鎖才可以被調用。鎖以調用裸體反方法的語句需要寫在同步大板塊里面,下面來看看執行結果。從執行結果來看,一秒鍾后等待的線程被喚醒程序結束,為證明notify方法只能喚醒單個等待的線程。 我們再創建兩個線程,一共是三個線程在等待。下面我們再來看看執行結果,從執行結果來看,只有一個線程被喚醒,只輸出了一句話,還有兩個線程依舊在等待程序,因還有線程未執行完而無法結束。下面我們再來介紹如何喚醒鎖有等待的線程,使用notify all方法就可以喚醒鎖有等待的線程,該方法同樣需要被鎖對象調用,也是位於or接到類里面。下面使用notify all方法喚醒剛剛鎖有等待的線程,改寫之前的程序,將note if I方法換成note,if I awe方法即可。 下面再來看看執行結果,從執行結果來看,鎖有線程被喚醒還說出了,三句話程序也結束了,最后來總結一下本節的內容。本節介紹了與同步同步鎖相關的等待喚醒機制,這里列舉了5個方法,其中前3個方法和等待相關后2個方法和喚醒相關wait方法的作用是使當前線程等待它還有兩個重載方法可以指定等待超時時間,若等待超時則自動喚醒note方法的作用,是喚醒單個等待的線程,note方法的作用是喚醒鎖有等待的線程在實際開發中以上方法經常被使用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM