java归还线程_再谈java线程
什么是等待喚醒機(jī)制?
這是多個(gè)線程間的一種協(xié)作機(jī)制。
就是一個(gè)線程進(jìn)行規(guī)定協(xié)作后,就進(jìn)入到了等待狀態(tài)'wait()',等待其他線程執(zhí)行完他們的指定代碼后,再將其喚醒'notify()';
在有多個(gè)線程進(jìn)行等待時(shí),如果需要,可以使用'notifyAll()'來(lái)喚醒所有的等待線程。
wait/notify就是線程間的一種協(xié)作機(jī)制。
等待喚醒中的方法;
等待喚醒機(jī)制就是用來(lái)解決線程間通信問(wèn)題的。可以使用到的方法有三個(gè)如下
1.wait();線程不在活動(dòng),不在參與調(diào)度,進(jìn)入到waiting設(shè)置中,因此不會(huì)浪費(fèi)cpu資源,也不會(huì)去競(jìng)爭(zhēng)鎖了,這時(shí)的線程狀態(tài)就是waiting,他還要等著別的線程執(zhí)行一個(gè)特別的動(dòng)作,就是喚醒通知'notify()',在這個(gè)對(duì)象上等待的線程從wait set中釋放出來(lái),重新進(jìn)入到調(diào)度隊(duì)列(ready queue)中。
2.notify();選取通知對(duì)象的wait set中的一個(gè)線程釋放。
3.notifyAll();釋放所通知對(duì)象的wait set中的全部線程。
//備注;哪怕只同時(shí)了一個(gè)等待線程,被通知的線程也不能立即回復(fù)執(zhí)行,因?yàn)樗?dāng)初中斷的地方是在同步塊內(nèi),而此刻它已經(jīng)不持有鎖了,所以它需要再次嘗試著去獲取鎖(很可能面臨其他線程的競(jìng)爭(zhēng)),成功后才能當(dāng)初調(diào)用wait方法之后的地方恢復(fù)執(zhí)行。
//總結(jié);如果能獲取到鎖,線程就從waiting狀態(tài)轉(zhuǎn)變成runnable狀態(tài),否則,從wait set中,又進(jìn)入set中,線程就從waiting狀態(tài)轉(zhuǎn)變成blocked狀態(tài)。
'調(diào)用wait和notify方法的注意細(xì)節(jié):'
1.wait方法和notify方法必須有同一個(gè)鎖對(duì)象調(diào)用。因?yàn)?#xff0c;對(duì)應(yīng)的鎖對(duì)象可以通過(guò)notify喚醒使用同一個(gè)鎖對(duì)象的wait方法后的線程。
2.wait與notify方法是屬于Object類中的方法。因?yàn)殒i對(duì)象可以是任意對(duì)象,而任意對(duì)象的所屬類都是繼承了Object類的。
3.wait與notify方法必須在同步代碼塊中或者同步方法中使用。因?yàn)楸仨毻ㄟ^(guò)鎖對(duì)象調(diào)用這兩個(gè)方法來(lái)實(shí)現(xiàn)等待與喚醒。
包子鋪線程生產(chǎn)包子,吃貨線程消費(fèi)包子,當(dāng)包子沒的時(shí)候狀態(tài)為false,吃貨線程需要等待,包子鋪線程生產(chǎn)包子包子狀態(tài)為true,通知吃貨線程并解除吃貨狀態(tài),因?yàn)橐呀?jīng)有包子,,包子鋪線程進(jìn)入等待狀態(tài),接下來(lái),吃貨線程能夠進(jìn)一步取決于鎖的獲取狀態(tài)情況,如果吃貨線程取得到了鎖,就執(zhí)行吃包子動(dòng)作,包子吃完了包子狀態(tài)為false,通知包子鋪線程解除包子鋪線程等待狀態(tài),此時(shí)吃貨線程就進(jìn)入到等待狀態(tài),包子鋪線程能否進(jìn)一步執(zhí)行則取決于鎖的獲取情況。
總結(jié)
以上是生活随笔為你收集整理的java归还线程_再谈java线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 优学院java架构52破解_[单选] 肢
- 下一篇: python qt designer 重