JAVA多執行緒(一)
要想了解多執行緒,首先需要了解一下多執行緒的基礎知識,如多執行緒生命週期
多執行緒的週期大體上分為五個,NEW,RUNNABLE,RUNNING,BLOCKED,TERMINATED.
在這裡我們首先,先想一個問題,是否執行緒.start之後,該執行緒就執行了呢?
- NEW(新建狀態):這裡如果沒有.start,此時的執行緒根本不存在,跟普通的建立一個物件沒有什麼區別.通過.start進入RUNNABLE狀態
- RUNNABLE(等待狀態):在這裡我們來回答一下前面所說的呼叫start之後時候執行緒就執行的問題,答案是否定的,因為所有的執行緒都需要CPU來排程.在這種狀態下,不管你呼叫的sleep,wait等都需要CPU排程,所有此狀態只能是意外終止或者是進入RUNNING狀態.
-
RUNNING(執行狀態):在此狀態其實也可以稱為RUNNABLE,反過來的話此說法就不成立.來說一下在此狀態轉化到別的狀態的方法. 進入TERMINATED狀態: * 只能用JDK8已經不推薦用的stop的方法,或者是通過某個標識來跳到此狀態中. 進入BLOCKED狀態中: *可以用sleep,wait進入waitSet佇列中等待.*IO流阻塞,如網路讀寫.*或者因為需要獲取某種鎖資源而進入 BLOCKED狀態中.
-
BLOCKED(阻塞狀態): 進入TERMINATED狀態: *呼叫JDK不推薦使用的stop方法或者意外死亡 進入RUNNABLE狀態: *執行緒阻塞的操作結束,比如讀取了想要的資料 *執行緒完成了指定的休眠 *Wait中的執行緒被其他執行緒notify/notifyall喚醒 *執行緒獲取到了想要的鎖資源 *執行緒在阻塞的過程中被打斷,比如其他執行緒呼叫了interrupt方法
-
TERMINATED(終止狀態):該狀態是執行緒最終狀態,所以不會切換到其他任何狀態中,執行緒進入TERMINATED狀態中,意味這執行緒結束. 進入TERMINATED狀態: *正常執行結束 *意外結束