1. 程式人生 > >線程的基本操作(二)

線程的基本操作(二)

對象鎖 隨機 函數 通知 style obj 訪問 隊列 基本操作

等待和通知(wait & notify)
這兩個方法並不是在Thread類中的,而是輸出Object類,這也意味著任何對象都可以調用這兩個方法。當一個線程調用obj.wait()後,該線程就會進入obj對象的等待隊列,當obj.notify()被調用時,它就會從這個等待隊列中隨機喚醒一個線程。
notifyAll()方法會將等待隊列中的所有線程都喚醒。
obj.wait()方法必須包含在相應的sychronized塊中。
在線程A中,obj.wait()方法在執行前需要先獲得目標對象obj的監視器,wait()方法執行完後會釋放這個監視器,同樣地,在線程B中,通過obj.notify()喚醒線程A(或其他等待隊列中的線程)時,需要先獲得obj的監視器(obj.wait()釋放的那個),obj.notify()執行完後釋放監視器,被喚醒的線程A仍然需要先獲得obj監視器,才能繼續往下執行。
Object.wait()和Thread.sleep() 都可以使線程等待一段時間,wait()可以被喚醒並且釋放對象鎖,sleep()不會釋放任何資源。


掛起和繼續執行(suspend & resume)
這兩個方法是被廢棄的方法,不建議使用。因為線程在suspend()後不會釋放任何鎖資源,其他想要訪問被它占用的鎖的時候會被牽連,無法正常運行,就好比一輛車停在了路口,其他車也無法同行
更重要的是,如果resume()意外地在suspend之前就執行了,線程一直阻塞,所占用的鎖將永遠不會釋放,並且線程的狀態是Runnable,這將影響我們對系統當前狀態的判斷。


等待線程結束和謙讓(join & yield)
t1.join()會使當前線程一直阻塞,直到t1線程執行完畢;t1.join(1000)會使線程等待1s。
join()的本質是讓調用線程wait()在當前線程的實例對象上,jdk中join()的核心代碼
while(isAlive()){
wait(0);
}
例如在main函數中調用t1.join(),當t1執行完之後退出之前,會調用notifyAll()通知所有等待線程”可以繼續執行了“。
註意:不要在應用程序中,在Thread對象實例上使用類似wait()和notify()方法,因為這可能會影響系統API工作或被影響。

-----------------------------------------------------《實戰Java高並發設計》筆記------------------------------------------------------

線程的基本操作(二)