Java編程語言在應用的時候需要我們不斷的進行相關知識的學習
首先我們先要理解notify()和wait()
只有理解了這個語句才能更好的進行相關的應用
希望大家有所收獲
為什麼在前幾天紀錄線程的時候沒有紀錄這兩個方法呢
因為這兩個方法本來就不屬於Thread類
而是屬於最底層的object基礎類的
也就是說不光是Thread
每個對象都有notify和wait的功能
為什麼?因為他們是用來操縱鎖的
而每個對象都有鎖
鎖是每個對象的基礎
既然鎖是基礎的
那麼操縱鎖的方法當然也是最基礎了
按照Think in Java中的解釋:
wait()允許我們將線程置入
睡眠
狀態
同時又
積極
地等待條件發生改變
而且只有在一個notify()或notifyAll()發生變化的時候
線程才會被喚醒
並檢查條件是否有變
我們來解釋一下這句話
wait()允許我們將線程置入
睡眠
狀態
也就是說
wait也是讓當前線程阻塞的
這一點和sleep或者suspend是相同的
那和sleep
suspend有什麼區別呢?
區別在於
(wait)同時又
積極
地等待條件發生改變
這一點很關鍵
sleep和suspend無法做到
因為我們有時候需要通過同步(synchronized)的幫助來防止線程之間的沖突
而一旦使用同步
就要鎖定對象
也就是獲取對象鎖
其它要使用該對象鎖的線程都只能排隊等著
等到同步方法或者同步塊裡的程序全部運行完才有機會
在同步方法和同步塊中
無論sleep()還是suspend()都不可能自己被調用的時候解除鎖定
他們都霸占著正在使用的對象鎖不放
而wait卻可以
它可以讓同步方法或者同步塊暫時放棄對象鎖
而將它暫時讓給其它需要對象鎖的人(這裡應該是程序塊
或線程)用
這意味著可在執行wait()期間調用線程對象中的其他同步方法!在其它情況下(sleep啊
suspend啊)
這是不可能的
但是注意我前面說的
在Java編程語言中只是暫時放棄對象鎖
暫時給其它線程使用
我wait所在的線程還是要把這個對象鎖收回來的呀
wait什麼?就是wait別人用完了還給我啊!好
那怎麼把對象鎖收回來呢?
第一種方法
限定借出去的時間
在wait()中設置參數
比如wait(
)
以毫秒為單位
就表明我只借出去
秒中
一秒鐘之後
我自動收回
第二種方法
讓借出去的人通知我
他用完了
要還給我了
這時
我馬上就收回來
哎
假如我設了
小時之後收回
別人只用了半小時就完了
那怎麼辦呢?靠!當然用完了就收回了
還管我設的是多長時間啊
那麼別人怎麼通知我呢?相信大家都可以想到了
notify()
這就是最後一句話
而且只有在一個notify()或notifyAll()發生變化的時候
線程才會被喚醒
的意思了
因此
我們可將一個wait()和notify()置入任何同步方法或同步塊內部
無論在那個類裡是否准備進行涉及線程的處理
而且實際上
我們也只能在同步方法或者同步塊裡面調用wait()和notify()
這個時候我們來解釋上面的程序
簡直是易如反掌了
synchronized(b){
}
在Java編程語言中的意思是定義一個同步塊
使用b作為資源鎖
b
wait();的意思是臨時釋放鎖
並阻塞當前線程
好讓其他使用同一把鎖的線程有機會執行
在這裡要用同一把鎖的就是b線程本身
這個線程在執行到一定地方後用notify()通知wait的線程
鎖已經用完
待notify()所在的同步塊運行完之後
wait所在的線程就可以繼續執行
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25920.html