1. 程式人生 > >哪幾種方式可用來實現執行緒間通知和喚醒

哪幾種方式可用來實現執行緒間通知和喚醒

從這三個方法的文字描述可以知道以下幾點資訊:

1)wait()、notify()和notifyAll()方法是本地方法,並且為final方法,無法被重寫。

2)呼叫某個物件的wait()方法能讓當前執行緒阻塞,並且當前執行緒必須擁有此物件的monitor(即鎖) 3)呼叫某個物件的notify()方法能夠喚醒一個正在等待這個物件的monitor的執行緒,如果有多個執行緒都在等待這個物件的monitor,則只能喚醒其中一個執行緒; 4)呼叫notifyAll()方法能夠喚醒所有正在等待這個物件的monitor的執行緒; 有朋友可能會有疑問:為何這三個不是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()方法是不同的。