先看看兩者的對比:

可以發現:
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()的通常是為了同步,也就是說多個線程之間配合工作,大家按照某個順序或者一定的條件來運行。典型模型如消費者生產者。
而鎖是為了互斥。

