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