首先,我們知道wait和notify方法是object類下的,用來讓執行緒放棄鎖等待和喚醒,既然與執行緒相關,為什麼沒有放在thread類
下,而是放在了object類下呢?(當然由於thread類繼承了object類,所以thread也可以呼叫者三個方法)
其實這個問題很簡單,由於每個物件都擁有monitor鎖,所以讓當前執行緒等待某個物件的鎖,當然應該通過這個物件來操作了。而
不是用當前執行緒來操作,因為當前執行緒可能會等待多個執行緒的鎖,如果通過執行緒來操作,就非常複雜了。
上面已經提到,如果呼叫某個物件的wait()方法,當前執行緒必須擁有這個物件的monitor(即鎖),因此呼叫wait()方法必須在
同步塊或者同步方法中進行(synchronized塊或者synchronized方法)。
呼叫某個物件的wait()方法,相當於讓當前執行緒交出此物件的monitor,然後進入等待狀態,等待後續再次獲得此物件的鎖
(thread類中的sleep方法使當前執行緒暫停執行一段時間,從而讓其他執行緒有機會繼續執行,但它並不釋放物件鎖);
notify()方法能夠喚醒乙個正在等待該物件的monitor的執行緒,當有多個執行緒都在等待該物件的monitor的話,則只能隨機喚醒
其中乙個執行緒,具體喚醒哪個執行緒則不得而知。
同樣地,呼叫某個物件的notify()方法,當前執行緒也必須擁有這個物件的monitor,因此呼叫notify()方法必須在同步塊或者同步
方法中進行(synchronized塊或者synchronized方法)。
nofityall()方法能夠喚醒所有正在等待該物件的monitor的執行緒,這一點與notify()方法是不同的。
這裡要注意一點:notify()和notifyall()方法只是喚醒等待該物件的monitor的執行緒,並不決定哪個執行緒能夠獲取到monitor。
假如有三個執行緒thread1、thread2和thread3都在等待物件objecta的monitor,此時thread4擁有物件objecta的monitor,當在
thread4中呼叫objecta.notify()方法之後,thread1、thread2和thread3只有乙個能被喚醒。注意,被喚醒不等於立刻就獲取了
objecta的monitor。假若在thread4中呼叫objecta.notifyall()方法,則thread1、thread2和thread3三個執行緒都會被喚醒,至於哪
個執行緒接下來能夠獲取到objecta的monitor就具體依賴於作業系統的排程了。
上面尤其要注意一點,乙個執行緒被喚醒不代表立即獲取了物件的monitor,只有等呼叫完notify()或者notifyall()並退出
synchronized塊,釋放物件鎖後,其餘執行緒才可獲得鎖執行。
sleep和wait的區別與聯絡
對於sleep 方法,我們首先要知道該方法是屬於thread類中的。而wait 方法,則是屬於object類中的。sleep 方法導致了程式暫停執行指定的時間,讓出cpu該其他執行緒,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復執行狀態。在呼叫sleep 方法的過程中,執行緒不會釋放物件...
sleep 與wait 的區別和聯絡
1.sleep thread類中的方法,wait 是object類的方法。2.sleep 不釋放物件鎖,wait 放棄物件鎖。3.wait 和sleep 都是讓出cpu佔有權,讓其它執行緒能夠得到執行,不同的地方在於wait 可以通過notify 或者notifyall 主動喚醒或者wait一定的等...
sleep與wait的區別
sleep與wait的區別 1.都是執行緒狀態切換的操作 2.sleep一定時間後會自動喚醒,wait則需要手動notify或notifyall 3.sleep不會釋放物件鎖,thread方法 wait會放棄物件鎖,是object方法,執行後會進入等待物件鎖池的佇列中 4.notify並不會釋放鎖,...