3 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
對(duì)于調(diào)用 wait() 或 notify() 的線程,該線程必須是該對(duì)象的鎖的所有者。
否則,會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤,并且不會(huì)執(zhí)行其余代碼。
當(dāng)線程等待時(shí),它會(huì)暫時(shí)釋放鎖以供其他線程使用
更詳細(xì)地說,調(diào)用wait()會(huì)執(zhí)行以下操作:
鎖被釋放
當(dāng)前線程在監(jiān)視器中注冊(cè)為等待
處理器切換到其他準(zhǔn)備執(zhí)行的線程
然后,一些線程調(diào)用notify()或notifyAll(),這會(huì)導(dǎo)致在此監(jiān)視器上注冊(cè)為等待的一個(gè)或所有線程從等待集移動(dòng)到就緒集,等待空閑處理器執(zhí)行。
但它會(huì)再次需要它來繼續(xù)執(zhí)行。
這意味著線程的執(zhí)行將繼續(xù)執(zhí)行同步語句以重新獲得鎖定。獲得鎖后,wait()方法返回。wait(timeout)的不同之處在于,除了notify()或notifyAll()之外,它還可以在超時(shí)時(shí)返回。
總之,您需要了解線程如何在以下 4 種狀態(tài)之間切換:
在處理器上運(yùn)行
在同步語句上阻塞
等待通知
準(zhǔn)備執(zhí)行并等待空閑處理器

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊
當(dāng)一個(gè)線程調(diào)用wait()
時(shí),它會(huì)暫時(shí)釋放對(duì)象的監(jiān)視器(鎖),直到它收到另一個(gè)線程的通知。這樣,一個(gè)線程可以心甘情愿地將對(duì)象監(jiān)視器的控制權(quán)(它首先擁有的)交給另一個(gè)線程??纯?a >文檔:
在另一個(gè)線程發(fā)出可能發(fā)生某些特殊事件的通知之前,調(diào)用
wait()
不會(huì)返回——盡管不一定是該線程正在等待的事件(因此始終wait()
在測(cè)試等待條件的循環(huán)內(nèi)調(diào)用)。...
當(dāng)
wait()
被調(diào)用時(shí),線程釋放鎖并暫停執(zhí)行。在未來某個(gè)時(shí)間,另一個(gè)線程將獲取相同的鎖并調(diào)用 Object.notifyAll,通知所有等待該鎖的線程發(fā)生了重要的事情。

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
當(dāng)一個(gè)線程調(diào)用 wait 時(shí),該線程立即釋放鎖,然后進(jìn)入休眠狀態(tài),直到超時(shí)到期(如果有),或者直到它收到通知,當(dāng)另一個(gè)線程獲得等待線程放棄并調(diào)用的相同鎖時(shí),就會(huì)發(fā)生這種情況通知它(調(diào)度程序也必須從任何其他等待線程中選擇等待線程;調(diào)用通知不會(huì)通知給定線程,它告訴調(diào)度程序從給定鎖的等待集中選擇一個(gè)線程來通知)。
一旦線程被通知喚醒,它必須重新獲得鎖才能離開等待方法,因?yàn)榫€程仍然在同步方法或塊內(nèi)。這就是引用的意思,當(dāng)它說線程需要鎖才能恢復(fù)執(zhí)行時(shí)。
添加回答
舉報(bào)