本篇文章為大家展示了java中實(shí)現(xiàn)線程掛起的方法有哪些,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)建站 - 成都二樞服務(wù)器租用托管,四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽服務(wù)器托管,德陽服務(wù)器托管,遂寧服務(wù)器托管,綿陽服務(wù)器托管,四川云主機(jī),成都云主機(jī),西南云主機(jī),成都二樞服務(wù)器租用托管,西南服務(wù)器托管,四川/成都大帶寬,服務(wù)器機(jī)柜,四川老牌IDC服務(wù)商
前言
在Java中使用線程的時候肯定會有線程掛起的這種情況出現(xiàn),在Java中提供了3種方式:suspend/resume、wait/notify,notifyAll、park/unpark。
1.suspend/resume
這種方式已經(jīng)在Java中被棄用,因?yàn)樗菀滓鹚梨i。在使用關(guān)鍵字synchronized的時候如
synchronized (this) { Thread.currentThread().suspend(); }
這個時候使用resume方法是無法喚醒線程的,還有一種情況是如果在resume方法之后才進(jìn)行suspend方法的調(diào)用,這個也是無法進(jìn)行suspend方法的喚醒的,因?yàn)檫@個事件發(fā)生的順序已經(jīng)造成了死鎖的出現(xiàn)。
2.wait/notify,notifyAll
這個是Java中常用的線程掛起方法,當(dāng)調(diào)用wait方法的時候線程會自動的釋放掉占有的線程資源鎖,然后通過notify或notifyAll方法進(jìn)行wait方法的喚醒,因此在這個地方不會出現(xiàn)死鎖,當(dāng)時如suspend/resume
中提到的,如果在notify或notifyAll方法之后在進(jìn)行wait操作,那么肯定也是會出現(xiàn)死鎖的。
這里必須說明一下的是sleep方法,雖然它也能將線程掛起,但是它會產(chǎn)生InterruptedException
異常,當(dāng)sleep一定時間后它將會自動執(zhí)行后面的方法,也可以通過interrupt方法進(jìn)行主動打斷sleep方法進(jìn)行線程喚醒。
3.park/unpark
park的字面量意思是指停車場的意思,使用park來掛起線程后需要調(diào)用unpark來進(jìn)行喚醒,這個沒有先后順序的區(qū)分,如果你提前進(jìn)行了unpark,然后在進(jìn)行park也是可以的,但是提前了的多個unpark只能看做是一個unpark,不能進(jìn)行重復(fù)疊加,如果再次park的話需要新的unpark來進(jìn)行喚醒操作,這個比如你在停車場進(jìn)行停車操作,你如果提前進(jìn)行了預(yù)約停車,你在未進(jìn)入停車場之前都是可以進(jìn)行多次預(yù)約的,這所有的預(yù)約只扣一次錢(unpark),但是這所有的預(yù)約操作都看作是你這一次進(jìn)入停車場停車(park)的憑證,如果你離開了通過繳費(fèi)憑證(unpark)一旦你想進(jìn)行下一次停車,那么已經(jīng)使用過的預(yù)約都不能進(jìn)行作數(shù)了,你只能再次預(yù)約或者直接進(jìn)入停車場,一旦要離開只能再次繳費(fèi)(unpark)。
調(diào)用park/unpark
使用的是LockSupport.park()/LockSupport.unpark()。
使用park/unpark
的使用使用synchronized關(guān)鍵字也會出現(xiàn)死鎖的情況,因?yàn)樗⒉会尫啪€程所占用的鎖資源,所以使用的時候也需要注意。
上述內(nèi)容就是java中實(shí)現(xiàn)線程掛起的方法有哪些,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。