Java線程阻塞工具LockSupport用法詳解
概述
LockSupport是一個非常方便實用的線程阻塞工具,它可以在線程內(nèi)任意位置讓線程阻塞。和 Thread.suspend()
相比,它彌補了由于 resume()
在前發(fā)生,導(dǎo)致線程無法繼續(xù)執(zhí)行的情況。和 Object.wait()
方法相比,它不需要先獲得某個對象的鎖,也不會拋出InterruptedException異常。
park()
可以阻塞當前線程,其中每一個線程都有一個許可,該許可默認為[不可用] 。
如果該許可是 [可用] 狀態(tài),那么 park()
方法會立即返回,消費這個許可,將該許可變更為 [不可用] 狀態(tài),流程代碼可以繼續(xù)執(zhí)行。
如果該許可是 [不可用] 狀態(tài),那么 park()
方法將會阻塞; unpark()
方法,會將指定線程的一個許可變?yōu)?[可用] 狀態(tài);
舉例解釋
為了便于大家理解,我們可以舉一個場景,就是A同學(xué)想要去食堂打飯(買漢堡),那么這個A同學(xué)就相當于我們的線程了。
情況1: 當A同學(xué)去取漢堡( 調(diào)用park()方法
)的時候,如果取餐臺沒有漢堡(即:許可為【不可用】狀態(tài)),則他需要等待(線程阻塞);
情況2: 當A同學(xué)去取漢堡( 調(diào)用park()方法
)的時候,如果取餐臺有漢堡(即:許可為【可用】狀態(tài)),則他拿走漢堡去吃飯,取餐臺又沒有漢堡了(許可從【可用】變?yōu)椤静豢捎谩繝顟B(tài))
情況3: 當服務(wù)員打算去補餐( 調(diào)用unpark()方法
)的時候,發(fā)現(xiàn)取餐臺沒有漢堡(即:許可為【不可用】狀態(tài)),則他去后廚拿來一個漢堡,放到取餐臺上(許可從【不可用】變?yōu)椤究捎谩繝顟B(tài))
情況4: 當服務(wù)員打算去補餐( 調(diào)用unpark()方法
)的時候,發(fā)現(xiàn)取餐臺已經(jīng)有漢堡了(即:許可為【可用】狀態(tài)),則他就去做別的事情了
為了方便大家理解,請見如下所示:
代碼示例
示例一: 先執(zhí)行 unpark() 方法再執(zhí)行 park() 方法,也不會造成永久卡死線程。如下所示:
示例二: LockSupport.park()還能支持中斷。但是它不會拋InterruptedException異常。它只會默默的返回,但是我們可以從Thread.interrupted()等方法獲得中斷標記。
到此這篇關(guān)于Java線程阻塞工具LockSupport用法詳解的文章就介紹到這了,更多相關(guān)Java LockSupport用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot Java后端實現(xiàn)okhttp3超時設(shè)置的方法實例
Okhttp的使用沒有httpClient廣泛,網(wǎng)上關(guān)于Okhttp設(shè)置代理的方法很少,下面這篇文章主要給大家介紹了關(guān)于SpringBoot Java后端實現(xiàn)okhttp3超時設(shè)置的相關(guān)資料,需要的朋友可以參考下2021-10-10WebDriver中實現(xiàn)對特定的Web區(qū)域截圖方法
這篇文章主要介紹了WebDriver中實現(xiàn)對特定的Web區(qū)域截圖方法,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-06-06java.lang.UnsupportedOperationException分析及解決辦法
日常開發(fā)中我遇到j(luò)ava.lang.UnsupportedOperationException:異常兩次了,下面這篇文章主要給對大家介紹了關(guān)于java.lang.UnsupportedOperationException分析及解決辦法,需要的朋友可以參考下2024-03-03