锁 唤醒_Java笔记|等待唤醒机制
等待喚醒案例分析:線程之間的通信
創建一個顧客線程(消費者):告知老板要的包子的種類和數量,調用wait方法,放棄cpu的執行,進入到WAITING狀態(無限等待)
創建一個老板線程(生產者):花了5秒做包子,做好包子之后,調用notify方法,喚醒顧客吃包子
注意:
顧客和老板線程必須使用同步代碼塊包裹起來,保證等待和喚醒只能有一個在執行
同步使用的鎖對象必須保證唯一
只有鎖對象才能調用wait和notify方法
Obejct類中的方法
Void wait()
在其他線程調用此對象的notify()方法或notifyAll()方法前,導致當前線程等待
Void notify()
喚醒在此對象監視器上等待的單個線程
會繼續執行wait方法之后的代碼
Object類中wait帶參方法和notify
進入到TimeWaiting(計時等待)有兩種方式:
1、使用sleep(long m)方法,在毫秒值結束之后,線程睡醒進入到Runnable/Blocked狀態
2、使用wait(long m)方法,wait方法如果在毫秒值結束之后,還沒有被notify喚醒,就會自動醒來,線程睡醒進入到Rummable/Blocked狀態
調用wait和notify方法需要注意的細節:
1、wait方法和notify方法必須要由同一個鎖對象調用。因為:對應的鎖對象可以通過notify喚醒使用同一個鎖對象調用的wait方法后的線程。
2、Wait方法和notify方法是屬于Object類的方法的。因為:鎖對象可以是任意對象,而任意對象的所屬類都是繼承了Object類的。
3、Wait方法和notify方法必須要在同步代碼塊或者是同步函數中使用的。因為:必須通過鎖對象調用這2個方法。
喚醒方法:
Void notify()喚醒在此對象監視器上等待的單個線程。
Void notifyAll()喚醒在此對象監視器上等待的所有線程。
線程間通信
1、為什么要處理線程間通信?
多個線程并發執行時候,在默認情況下CPU是隨機切換線程的,當我們需要多個線程來共同完成一件任務,并且我們希望他們有規律的執行,那么多線程之間需要一些協調通信,以此來幫我們達到多線程共同操作一份數據。
2、如何保證線程間通信有效利用資源?
多個線程在處理同一個資源,并且任務不同時,需要線程通信來幫助解決線程之間對同一個變量的使用或操作。就是多個線程在操作同一份數據時,避免對同一共享變量的爭奪。也就是我們需要通過一定的手段使各個線程能有效的利用資源。而這種手段即————等待喚醒機制
注意:
包子鋪線程和包子線程關系:通信(互斥)必須同時同步技術保證兩個線程只能有一個在執行鎖對象必須保證唯一,可以使用包子對象作為鎖對象包子鋪類和吃貨類就需要把包子對象作為參數傳遞進來1、需要在成員位置創建一個包子變量2、使用帶參數構造方法,為這個包子變量賦值 消費者(吃貨)類:是一個線程類,可以繼承Thread 設置線程任務(run):吃包子 對包子的狀態進行判斷 false:沒有包子吃貨吃包子吃貨吃完包子修改包子的狀態為false沒有吃貨喚醒包子鋪線程,生產包子 測試類: 包含main方法,程序執行的入口,啟動程序 創建包子對象; 創建包子鋪線程,開啟,生產包子; 創建吃貨線程,開啟,吃包子;總結
以上是生活随笔為你收集整理的锁 唤醒_Java笔记|等待唤醒机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用奇异值谱分析鉴定振荡成份
- 下一篇: jsp数据传入html页面_曾经风光无限