java線程和操作系統線程的異同(大圖對比)


先看看兩者的對比:

 

可以發現:

1.java中細分了阻塞,將阻塞給分成了三個不同類型的阻塞。

2.java沒有區分就緒狀態和運行狀態。java將這兩種狀態合並成runnable狀態。

3.還有一個容易被忽略的點:java中的IO阻塞,在java中的線程狀態實際上是runnable。


jvm沒有做實際的線程調度,而是交給操作系統來完成。java只是對操作系統中的線程模型做了一個包裝。

 

 

就緒狀態:

java與操作系統的狀態對應如圖所示:

對於運行和就緒狀態的合並

一種解釋是:在實際使用中,運行和就緒狀態的切換是很快的,在對於線程監控上我們幾乎不能察覺到兩者的區別,於是合並成了一個。

但該說法無法解釋將為什么將IO阻塞也囊括進runnable狀態。

 

對於等待資源的狀態

jvm認為,等待資源的線程處於就緒狀態,等待cpu和等待IO都被認為是就緒狀態。

而在操作系統中,只有等待cpu運行權的才屬於就緒狀態。

 

 

阻塞狀態

因為不能獲取到鎖(synchronized),而進入的阻塞狀態,在java中對應blocked。

線程使用wait()和join()等,主動陷入阻塞狀態,則為waiting狀態。

wait狀態具體又分為了waiting和timed waiting。

 

簡單區分一下兩者使用的場合:

我們使用wait()的通常是為了同步,也就是說多個線程之間配合工作,大家按照某個順序或者一定的條件來運行。典型模型如消費者生產者。

而鎖是為了互斥。


免責聲明!

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



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