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();
}

創建線程的幾種方式

看過下面這篇文章,真的總結得太好了,我着這辣雞就別去關公面前耍大刀了,附上大佬的鏈接
http://blog.csdn.net/longshengguoji/article/details/41126119

發佈了45 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章