先看看兩者的對比:

可以發現:

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()的通常是為了同步,也就是說多個執行緒之間配合工作,大家按照某個順序或者一定的條件來執行。典型模型如消費者生產者。

而鎖是為了互斥。