區分等待、阻塞,加拓展

在java中,很多時候我們忽略的基本的知識,這是很致命的,只有搞懂Thread的基礎知識,才能進一步探索:reentrantLock,AQS等。

1:Thread的線程狀態到底有幾種?

6種:

public enum State {/*** Thread state for a thread which has not yet started.尚未啟動的線程的線程狀態。*/NEW,/*** Thread state for a runnable thread. 可運行線程的線程狀態。*/RUNNABLE,/*** A thread in the blocked state is waiting for a monitor lock* to enter a synchronized block/method or* reenter a synchronized block/method after calling* 等待獲取鎖的狀態,或者等待獲取重入鎖的狀態*/BLOCKED,/*** Thread state for a waiting thread. 線程等待狀態調用以下方法都可以使一個線程進入等待狀態 -》等待后必須通過notify(),notifyAll()才能喚醒,喚醒后才能重新去嘗試獲取CPU的執行權* <ul>*   <li>{@link Object#wait() Object.wait} with no timeout</li>*   <li>{@link #join() Thread.join} with no timeout</li>*   <li>{@link LockSupport#park() LockSupport.park}</li>* </ul>*/WAITING,/*** Thread state for a waiting thread with a specified waiting time.* 有期限的等待,超時等待。以下方法:*  sleep Thread.sleep*  Object#wait(long) *  join(long) Thread.join*  LockSupport#parkNanos LockSupport.parkNanos*  LockSupport#parkUntil LockSupport.parkUntil*/TIMED_WAITING,/*** Thread state for a terminated thread.* 線程結束*/TERMINATED;}

以上源碼就解釋了什么是阻塞,等待,但是沒有掛起,為什么沒有掛起狀態,因為線程掛起這種操作已經過時,不建議使用了,這里不做過多討論,有人愿意研究的,請自行搜索:線程掛起。不要搜跟阻塞,等待的區別,很多都說錯了。

2:到底如何區分阻塞,等待?

一切回歸原始:假設一個場景:多個線程任務執行在同一個單核cpu上,在我們獲取臨界資源的時候,為了線程安全,是要加鎖的,假設鎖是synchronized,那么同一時刻,只有一個線程任務能獲取鎖資源,那么其它的線程就進入了:blocked狀態,等待獲取鎖的狀態,如上代碼BLOCKED,? 此時,這些沒有獲取到鎖的線程有一些條件:1:他們都是可以隨時被CPU上下文切換獲取到執行權的。2:他們雖然可以獲取CPU執行的時間片,但是他們無法獲取鎖。所以被阻塞在這里了。

基于以上兩點,那么他們處于阻塞狀態。而第一個獲取到鎖的線程,是runnable狀態。

如果有大量線程為了競爭同一把鎖(同一臨界資源)而發生大面積阻塞,就會形成線程饑餓。

那什么是等待?還是上面的場景,加入有一個線程(第一個線程)獲取到了鎖,那么其它任何線程嘗試獲取鎖都會失敗,一旦失敗,調用方法讓他們進入等待的話,他們就不能再獲取到CPU執行權了,跟上面所說的阻塞特征的第一點沖突,另外,他們也不會一直嘗試去獲取鎖了,因為他們拿不到CPU執行權,相當于一個癱瘓的人沒有CPU的幫扶,是無法站起來的。 那么他們如何才能站起來,繼續有機會獲取CPU執行權,進而獲取鎖呢? --喚醒-》notify。 所以,假如一個線程是wait狀態已經,如果沒有任何線程去喚醒它,那它永遠是死的,如果大量的線程一旦永無機會被喚醒的話,將會占用大量內存。


到這里我們一起看一下我sleep和wait的區別

sleep和wait_肥春勿擾的博客-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35955.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35955.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35955.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringCloud微服務之間如何進行用戶信息傳遞(涉及:Gateway、OpenFeign組件)

目錄 1、想達到的效果2、用戶信息在微服務之間傳遞的兩種途徑3、用RuoYi-Cloud為例進行演示說明&#xff08;1&#xff09;網關將用戶信息寫在請求頭中&#xff08;2&#xff09;業務微服務之間通過OpenFeign進行調用&#xff0c;并且將用戶信息寫在OpenFeign準備的請求頭中&am…

香港站群服務器為什么適合seo優化?

?  香港站群為什么適合seo優化?本文主要從以下四點出發進行原因闡述。 1.香港站群服務器的優勢 2.香港站群服務器與國內服務器的對比 3.多IP站群服務器的優勢 4.香港站群服務器在SEO優化中的注意事項 1.香港站群服務器的優勢 香港站群服務器是為了滿足企業SEO優化需求而提供…

GD32F103VE使用DMA傳輸讀取內部溫度和參考電壓值

GD32F103VE使用DMA傳輸讀取內部溫度和參考電壓值。出廠CPU芯片不同&#xff0c;溫度誤差不同&#xff0c;不要糾結了。 GD32F103的ADC為12位AD轉換器,ADC轉換結果保存在16位數據寄存器中; 模擬輸入通道&#xff1a; 16個外部模擬輸入通道; 1個內部溫度傳感器通道(Vsense) 1個…

【electron】electron安裝過慢和打包報錯:Unable to load file:

文章目錄 一、安裝過慢問題:二、打包報錯&#xff1a;Unable to load file: 一、安裝過慢問題: 一直處于安裝過程 【解決】 #修改npm的配置文件 npm config edit#添加配置 electron_mirrorhttps://cdn.npm.taobao.org/dist/electron/二、打包報錯&#xff1a;Unable to load…

camera hal|如何學習一個新平臺

全網最具價值的Android Camera開發學習系列資料~ 作者:8年Android Camera開發,從Camera app一直做到Hal和驅動~ 歡迎訂閱,相信能擴展你的知識面,提升個人能力~ 我自己目前從事的是android camera hal 的工作,工作上接觸到的芯片平臺要么是高通的,要么是mtk的。 其實…

c語言作業

作業1&#xff1a; 關于實參和形參 形參是實參的一份臨時拷貝。 形參是在函數調用的時候才實例化&#xff0c;才開辟內存空間。 函數調用如果采用傳值調用&#xff0c;改變形象不影響實參。 改變形參不是影響實參。 作業2&#xff1a; 函數調用exec&#xff08;&#xf…

C++QT教程3——手冊4.11.1自帶教程(筆記)——創建一個基于Qt Widget的應用程序

文章目錄 創建一個基于Qt Widget的應用程序創建Text Finder項目素材文件 填補缺失的部分設計用戶界面完成頭文件完成源文件創建資源文件 編譯和運行程序 參考文章 創建一個基于Qt Widget的應用程序 本教程介紹如何使用Qt Creator創建一個小型Qt應用程序&#xff0c;名為Text F…

電腦IP地址錯誤無法上網怎么辦?

電腦出現IP地址錯誤后就將無法連接網絡&#xff0c;從而無法正常訪問互聯網。那么當電腦出現IP地址錯誤時該怎么辦呢&#xff1f; 確認是否禁用本地連接 你需要先確定是否禁用了本地網絡連接&#xff0c;如果發現禁用&#xff0c;則將其啟用即可。 啟用方法&#xff1a;點擊桌…

Spring 使用注解開發、代理模式、AOP

使用注解開發 在Spring4之后&#xff0c;要使用注解開發&#xff0c;必須要保證AOP的包導入了 項目搭建&#xff1a; 在配置文件中導入約束&#xff0c;增加注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…

uniapp把城市換成26個字母和城市排序

后端返回的數據 我們要得效果 <template><view><view v-for"(value,key) in cities" :key"key"><view style"color: red;"> {{ key }} </view><view style"border: 1rpx solid black;"><tex…

PostgreSql 備份恢復

一、概述 數據庫備份一般可分為物理備份和邏輯備份&#xff0c;其中物理備份又可分為物理冷備和物理熱備&#xff0c;下面就各種備份方式進行詳細說明&#xff08;一般情況下&#xff0c;生產環境采取的定時物理熱備邏輯備份的方式&#xff0c;均是以下述方式為基礎進一步研發編…

Linux 基礎

鞏固基礎&#xff0c;砥礪前行 。 只有不斷重復&#xff0c;才能做到超越自己。 能堅持把簡單的事情做到極致&#xff0c;也是不容易的。 linux的目錄結構 linux的文件系統采用樹狀的目錄結構&#xff0c;在此結構的最上層是根目錄“/”&#xff0c; 然后在此目錄下再創建其他…

【算法——雙指針】LeetCode 1089 復寫零

千萬不要被這道題標注著“簡單”迷惑了&#xff0c;實際上需要注意的細節很多。 題目描述&#xff1a; 解題思路&#xff1a; 正序遍歷&#xff0c;確定結果數組的最后一個元素所在的位置&#xff1b;知道最后一個元素的位置后倒序進行填充。 先找到最后一個需要復寫的數 先…

javaee dom4j讀取xml文件

引入jar包 dom4j-1.6.1.jar 創建xml文件 <?xml version"1.0" encoding"UTF-8"?> <books><book id"1"><title ID"t1">背影</title><price>88</price><author>三毛</author>…

Excel表格制作,快速提升效率好方法!

“作為一個剛開始工作的職場新人&#xff0c;每天要做各種不同的表格&#xff0c;真的讓我很崩潰&#xff0c;感覺我對這些表格制作一點都不了解&#xff0c;Excel表格制作有什么比較好的方法嗎&#xff1f;” Excel作為一款廣泛應用于各個領域的管理和分析工作&#xff0c;給我…

【STM32】FreeRTOS消息隊列和信號量學習

一、消息隊列&#xff08;queue&#xff09; 隊列是一種用于實現任務與任務之間&#xff0c;任務與中斷之間消息交流的機制。 注意&#xff1a;1.數據的操作是FIFO模式。 2.隊列需要明確數據的大小和隊列的長度。 3.寫和讀都會出現堵塞。 實驗&#xff1a;創建一個消息隊列…

解決 Oracle 數據庫中表被鎖問題的方案和方法

我們經常會遇到表被鎖的情況&#xff0c;這可能會嚴重影響數據庫的性能和可用性。我將與大家分享如何識別、分析和解決這些問題&#xff0c;以及如何使用特定的 SQL 查詢來執行解鎖操作。 了解表鎖的原因 首先&#xff0c;讓我們來了解一下導致表被鎖的常見原因。長時間運行的…

(四)Unity開發Vision Pro——參考文檔

4.參考文檔 4.1 支持的功能和組件 4.1.1 支持的 Unity 功能和組件 大多數 Unity 組件無需修改即可在此平臺上運行 - 包括大多數自定義 MonoBehaviours、動畫邏輯、物理、輸入處理、資產管理、AI 等。然而&#xff0c;需要渲染的組件需要特殊的支持。因此&#xff0c;一些組件…

qt5.15.2 使用mysql8.1

報錯&#xff1a; QMYSQL driver not loaded 報錯&#xff1a;無 QMYSQL 使用 QStringList drivers QSqlDatabase::drivers(); //獲取現在可用的數據庫驅動 foreach(QString driver, drivers) qDebug() << driver; “QSQLITE” “QMARIADB” “QMYSQL” “QMYSQL3” “…

Linux常用命令——dmidecode命令

在線Linux命令查詢工具 dmidecode 在Linux系統下獲取有關硬件方面的信息 補充說明 dmidecode命令可以讓你在Linux系統下獲取有關硬件方面的信息。dmidecode的作用是將DMI數據庫中的信息解碼&#xff0c;以可讀的文本方式顯示。由于DMI信息可以人為修改&#xff0c;因此里面…