java中線程掛起的幾種方式詳解
前言
在Java中使用線程的時(shí)候肯定會(huì)有線程掛起的這種情況出現(xiàn),在Java中提供了3種方式:suspend/resume、wait/notify,notifyAll、park/unpark。
1.suspend/resume
這種方式已經(jīng)在Java中被棄用,因?yàn)樗菀滓鹚梨i。在使用關(guān)鍵字synchronized的時(shí)候如
synchronized (this) {
Thread.currentThread().suspend();
}
這個(gè)時(shí)候使用resume方法是無(wú)法喚醒線程的,還有一種情況是如果在resume方法之后才進(jìn)行suspend方法的調(diào)用,這個(gè)也是無(wú)法進(jìn)行suspend方法的喚醒的,因?yàn)檫@個(gè)事件發(fā)生的順序已經(jīng)造成了死鎖的出現(xiàn)。
2.wait/notify,notifyAll
這個(gè)是Java中常用的線程掛起方法,當(dāng)調(diào)用wait方法的時(shí)候線程會(huì)自動(dòng)的釋放掉占有的線程資源鎖,然后通過(guò)notify或notifyAll方法進(jìn)行wait方法的喚醒,因此在這個(gè)地方不會(huì)出現(xiàn)死鎖,當(dāng)時(shí)如suspend/resume中提到的,如果在notify或notifyAll方法之后在進(jìn)行wait操作,那么肯定也是會(huì)出現(xiàn)死鎖的。
這里必須說(shuō)明一下的是sleep方法,雖然它也能將線程掛起,但是它會(huì)產(chǎn)生InterruptedException異常,當(dāng)sleep一定時(shí)間后它將會(huì)自動(dòng)執(zhí)行后面的方法,也可以通過(guò)interrupt方法進(jìn)行主動(dòng)打斷sleep方法進(jìn)行線程喚醒。
3.park/unpark
park的字面量意思是指停車場(chǎng)的意思,使用park來(lái)掛起線程后需要調(diào)用unpark來(lái)進(jìn)行喚醒,這個(gè)沒有先后順序的區(qū)分,如果你提前進(jìn)行了unpark,然后在進(jìn)行park也是可以的,但是提前了的多個(gè)unpark只能看做是一個(gè)unpark,不能進(jìn)行重復(fù)疊加,如果再次park的話需要新的unpark來(lái)進(jìn)行喚醒操作,這個(gè)比如你在停車場(chǎng)進(jìn)行停車操作,你如果提前進(jìn)行了預(yù)約停車,你在未進(jìn)入停車場(chǎng)之前都是可以進(jìn)行多次預(yù)約的,這所有的預(yù)約只扣一次錢(unpark),但是這所有的預(yù)約操作都看作是你這一次進(jìn)入停車場(chǎng)停車(park)的憑證,如果你離開了通過(guò)繳費(fèi)憑證(unpark)一旦你想進(jìn)行下一次停車,那么已經(jīng)使用過(guò)的預(yù)約都不能進(jìn)行作數(shù)了,你只能再次預(yù)約或者直接進(jìn)入停車場(chǎng),一旦要離開只能再次繳費(fèi)(unpark)。
調(diào)用park/unpark使用的是LockSupport.park()/LockSupport.unpark()。
使用park/unpark的使用使用synchronized關(guān)鍵字也會(huì)出現(xiàn)死鎖的情況,因?yàn)樗⒉会尫啪€程所占用的鎖資源,所以使用的時(shí)候也需要注意。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?IOC?xml方式進(jìn)行工廠Bean操作詳解
這篇文章主要介紹了Spring?IOC?xml方式進(jìn)行工廠Bean操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01
關(guān)于Spring?@Transactional事務(wù)傳播機(jī)制詳解
我們?nèi)粘9ぷ髦袠O少使用事務(wù)傳播級(jí)別,單純只是使用事務(wù)和rollbackfor拋出異常來(lái)解決事務(wù)問(wèn)題,但其實(shí)我們很多時(shí)候使用的是不正確的,或者說(shuō)會(huì)造成事務(wù)粒度過(guò)大,本文詳解一下事務(wù)傳播級(jí)別,也讓自己更好地處理事務(wù)問(wèn)題,需要的朋友可以參考下2023-08-08
logback-spring.xml的配置及示例詳解(直接復(fù)制粘貼可用)
在使用logback作為日志框架時(shí),可以創(chuàng)建一個(gè)名為logback-spring.xml的配置文件來(lái)自定義日志輸出的格式和方式,下面這篇文章主要給大家介紹了關(guān)于logback-spring.xml的配置及示例詳解的相關(guān)資料,文中的代碼直接復(fù)制粘貼可用,需要的朋友可以參考下2024-01-01
利用Jackson解決Json序列化和反序列化問(wèn)題
Jackson是一個(gè)用于處理Json數(shù)據(jù)的Java庫(kù),它提供了一系列功能,包括Json序列化和反序列化,所以本文就來(lái)講講如何利用利用Jackson解決Json序列化和反序列化的問(wèn)題吧2023-05-05
vue3使用vue-diff工具來(lái)比較數(shù)據(jù)差異
這篇文章主要為大家詳細(xì)介紹了vue3如何使用vue-diff工具來(lái)比較數(shù)據(jù)差異,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
Spring Boot命令行啟動(dòng)添加參數(shù)的三種方式
在命令行中,常見的參數(shù)可以分為三類:選項(xiàng)參數(shù)、非選項(xiàng)參數(shù)和系統(tǒng)參數(shù),本文就來(lái)介紹一下Spring Boot命令行三種參數(shù)形式,感興趣的可以了解一下2023-09-09
SpringBoot?2.5.5整合輕量級(jí)的分布式日志標(biāo)記追蹤神器TLog的詳細(xì)過(guò)程
分布式追蹤系統(tǒng)是一個(gè)最終的解決方案,如果您的公司已經(jīng)上了分布式追蹤系統(tǒng),這篇文章主要介紹了SpringBoot?2.5.5整合輕量級(jí)的分布式日志標(biāo)記追蹤神器TLog,需要的朋友可以參考下2022-10-10
SpringBoot 入門教程之引入數(shù)據(jù)傳輸層的方法
這篇文章主要介紹了SpringBoot 入門教程之引入數(shù)據(jù)傳輸層的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07

