1. 程式人生 > >java併發程式設計的藝術(五)-----執行緒狀態

java併發程式設計的藝術(五)-----執行緒狀態

執行緒與程序?

執行緒是作業系統排程的最小單元,而程序是系統進行資源分配和排程的一個基本單位。
簡單理解:程序是程式的一次執行,執行緒可以理解為程序中的執行的一段程式片段
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();
}

建立執行緒的幾種方式