java併發程式設計的藝術(五)-----執行緒狀態
阿新 • • 發佈:2019-02-12
執行緒與程序?
執行緒是作業系統排程的最小單元,而程序是系統進行資源分配和排程的一個基本單位。
簡單理解:程序是程式的一次執行,執行緒可以理解為程序中的執行的一段程式片段
360解釋:程序是一個具有獨立功能的程式關於某個資料集合的一次執行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程式的程式碼,還包括當前的活動,通過程式計數器的值和處理暫存器的內容來表示。
執行緒狀態:
執行緒從被建立到終止一共有六種狀態,分別是初始狀態、執行狀態、阻塞狀態、等待狀態、超時等待狀態以及終止狀態。
如何判讀執行緒處於什麼樣的狀態
當執行緒被New例項化後,就意味著執行緒處於了初始狀態
當執行緒呼叫Thread.start方法後,執行緒就進入了執行狀態,表明執行緒只要得到系統資源就可以直接執行。其中執行狀態分為就緒和執行中,就緒狀態指的是執行緒在等待系統CPU等系統資源,當獲得系統資源則真正進入執行狀態
- 在就緒狀態與執行中狀態之間需要系統排程,當執行緒呼叫sleep、wait、join等方法時,執行緒就會進入等待狀態或超時等待狀態,進入等待狀態的執行緒需要其他執行緒的通知(notify、notifyAll、unpark)才能返回到可執行狀態,而超時狀態則時增加了超時後自動返回執行狀態的機制。
- 在執行狀態中,如果未獲取到鎖執行緒就會進入阻塞狀態(被阻止在進入synchronized方法),直到獲取鎖或者被打斷才可繼續執行程式或者返回
- 當執行緒執行完Runnable的run方法之後就進入了終止狀態
java等待/通知機制
是什麼?
Java等待/通知機制指的是一個執行緒A呼叫了物件的wait方法進入等待狀態,而另外的一個執行緒B呼叫物件的notify或者notifyAll方法,執行緒A感知到這種變化過後從物件的wait方法返回進行後續的程式碼操作。最終這兩個執行緒的程式碼執行是建立在這個物件上面進行互動的
有什麼用?
實現“做什麼”和“怎麼做”之間的功能解耦,讓程式之間具有良好的可伸縮性。“做什麼”由消費者決定,它去通知相應的消費者實現做什麼,而消費者接收到通知後去實現怎麼做。
等待/通知的經典範式:
等待方(消費者):
//獲取鎖
synchronized(物件){
//條件滿足進行後續操作,完成怎麼做
//迴圈檢查條件不滿足則繼續等待
while(條件不滿足){
物件.wait();
}
滿足後的程式碼執行
}
通知方(生產者)
//獲取鎖
synchronized(物件){
改變條件
物件.notifyAll();
}