什麼是線程阻塞?爲什麼會出現線程阻塞?

什麼是線程阻塞?

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

爲什麼會出現線程阻塞?

1.睡眠狀態:當一個線程執行代碼的時候調用了sleep方法後,線程處於睡眠狀態,需要設置一個睡眠時間,此時有其他線程需要執行時就會造成線程阻塞,而且sleep方法被調用之後,線程不會釋放鎖對象,也就是說鎖還在該線程手裏,CPU執行權還在自己手裏,等睡眠時間一過,該線程就會進入就緒狀態,典型的“佔着茅坑不拉屎”;

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

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

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章