什么是線程阻塞?為什么會出現線程阻塞?


 

什么是線程阻塞?

在某一時刻某一個線程在運行一段代碼的時候,這時候另一個線程也需要運行,但是在運行過程中的那個線程執行完成之前,另一個線程是無法獲取到CPU執行權的(調用sleep方法是進入到睡眠暫停狀態,但是CPU執行權並沒有交出去,而調用wait方法則是將CPU執行權交給另一個線程),這個時候就會造成線程阻塞。

為什么會出現線程阻塞?

1.睡眠狀態:

當一個線程執行代碼的時候調用了sleep方法后,線程處於睡眠狀態,需要設置一個睡眠時間,此時有其他線程需要執行時就會造成線程阻塞,而且sleep方法被調用之后,線程不會釋放鎖對象,但是鎖還在該線程手里,等睡眠一段時間后,該線程就會進入就緒狀態,典型的“占着茅坑不拉屎”;

2.等待狀態:

當一個線程正在運行時,調用了wait方法,此時該線程需要交出CPU執行權,也就是將鎖釋放出去,交給另一個線程,該線程進入等待狀態,但與睡眠狀態不一樣的是,進入等待狀態的線程不需要設置睡眠時間,但是需要執行notify方法或者notifyall方法來對其喚醒,自己是不會主動醒來的,等被喚醒之后,該線程也會進入就緒狀態,但是進入僅需狀態的該線程手里是沒有執行權的,也就是沒有鎖,而睡眠狀態的線程一旦蘇醒,進入就緒狀態時是自己還拿着鎖的。等待狀態的線程蘇醒后,就是典型的“物是人非,大權旁落“;

3.禮讓狀態:

當一個線程正在運行時,調用了yield方法之后,該線程會將執行權禮讓給同等級的線程或者比它高一級的線程優先執行,此時該線程有可能只執行了一部分而此時把執行權禮讓給了其他線程,這個時候也會進入阻塞狀態,但是該線程會隨時可能又被分配到執行權,這就很”中國化的線程“了,比較講究謙讓;

4.自閉狀態:

當一個線程正在運行時,調用了一個join方法,此時該線程會進入阻塞狀態,另一個線程會運行,直到運行結束后,原線程才會進入就緒狀態。這個比較像是”走后門“,本來該先把你的事情解決完了再解決后邊的人的事情,但是這時候有走后門的人,那就會停止給你解決,而優先把走后門的人事情解決了;

5.suspend() 和 resume() :

這兩個方法是配套使用的,suspend() 是讓線程進入阻塞狀態,它的解葯就是resume(),沒有resume()它自己是不會恢復的,由於這種比較容易出現死鎖現象,所以jdk1.5之后就已經被廢除了,這對就是相愛相殺的一對。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM