Java線程的狀態

線程擁有本身的生命週期,一條線程從建立到執行完畢的過程便是線程的生命週期,此過程可能在不一樣時刻處於不一樣的狀態,線程到底有多少種狀態?不一樣狀態之間是如何轉化的?多線程

對於線程的狀態的分類並無嚴格的規定,只要能正確表示狀態便可,如圖,先看其中一種狀態分類,一個線程從建立到死亡可能會經歷若干個狀態,但在任意一個時間點線程只能處於其中一種狀態,總共包含五個狀態:新建(new)、可運行(runnable)、運行(running)、非可運行(not runnable)、死亡(dead)。併發

這裏寫圖片描述

線程的狀態的轉化能夠由程序控制,經過某些API能夠達到轉化效果,例如Thread類的start、stop、sleep、suspend、resume、wait、notify等方法(stop、suspend、resume等方法由於容易引發死鎖問題而早已被棄用)。機器學習

  • 新建(new):一個線程被建立了但未被啓動就處於新建狀態,即在程序中使用new MyThread();建立的線程實例就處於此狀態。
  • 可運行(runnable):建立的線程實例調用start()方法後便進入可運行狀態,處於此狀態的線程並非說必定處於運行狀態,Java多線程使用的線程調度策略是搶佔式調度,每一個可運行線程輪着獲取CPU時間片,能夠虛擬想象成有一個可運行線程池,start()方法把線程放進可運行線程池中,CPU按必定規則一個個執行池裏的線程。
  • 運行(running):當可運行線程獲取到CPU執行時間片即進去了運行狀態。
  • 非可運行(not runnable):運行中的線程因某種緣由暫時放棄CPU的使用權,多是由於執行了掛起、睡眠或等待等操做,在執行I/O操做時因爲外部設備速度遠低於處理器速度也可能致使線程暫時放棄CPU使用權,在獲取對象的同步鎖過程當中若是同步鎖先被別的線程佔用一樣可能致使線程暫時放棄CPU。
  • 死亡(dead):線程執行完run()方法實現的任務,或由於異常致使退出任務,線程進入死亡狀態後將不可再轉換成其餘狀態。

將非可運行(not runnable)狀態繼續細分,如圖,新建、可運行、運行、死亡四個狀態的定義和轉化與前面的同樣,重點看非可運行狀態引伸出來的三個狀態:阻塞(blocked)、同步鎖(locked)、等待(waiting)。分佈式

這裏寫圖片描述

  • 阻塞(blocked):阻塞由阻塞事件觸發,線程處於阻塞狀態將放棄CPU的使用權,暫時中止運行。通常線程執行了sleep()、join()方法,或發出了I/O請求,線程就將處於阻塞狀態,假如sleep()執行的睡眠結束、join()執行的等待中斷超時、I/O請求結束,則將從新回到可執行狀態,等待分配CPU。
  • 同步鎖(locked):假如一個線程準備調用一個同步方法,而同步方法對應的對象正被其餘線程佔用,此時線程就將進入同步鎖狀態。實際上,Java中的每一個object對象都有一個monitor,此monitor負責對同步域在併發時的獨佔處理,即一個線程調用某對象的同步方法時,JVM將檢測改對象的monitor是否已被佔用,若是沒有被佔用,線程則獲得monitor佔有權,繼續執行該對象的同步方法,不然線程將被扔進一個等待線程隊列排隊,直到monitor被釋放後,全部等待的線程繼續競爭monitor佔有權,搶到monitor佔有權後才進入可執行狀態等待CPU的分配,纔有資格執行同步方法。
  • 等待(waiting):運行中的線程執行了wait()方法後就進入等待狀態。一個對象執行了wait()方法一樣將使線程進入該對象的等待線程隊列,同時它還將釋放對象鎖,即放棄monitor的佔有權。只有在其餘線程中對該對象調用notify()、notifyAll()方法時纔會喚醒等待線程隊列中的線程,notify是隨機喚醒等待隊列中的一個線程,而nofityAll則是喚醒全部等待隊列中的線程,全部線程被喚醒後將對該對象的monitor佔有權競爭,獲取到佔有權的線程才能轉化爲可執行狀態,等待分配CPU往下執行,其餘線程則繼續等待。

-------------推薦閱讀------------學習

個人2017文章彙總——機器學習篇.net

個人2017文章彙總——Java及中間件線程

個人2017文章彙總——深度學習篇設計

個人2017文章彙總——JDK源碼篇3d

個人2017文章彙總——天然語言處理篇cdn

個人2017文章彙總——Java併發篇


跟我交流,向我提問:

這裏寫圖片描述

公衆號的菜單已分爲「讀書總結」、「分佈式」、「機器學習」、「深度學習」、「NLP」、「Java深度」、「Java併發核心」、「JDK源碼」、「Tomcat內核」等,可能有一款適合你的胃口。

爲何寫《Tomcat內核設計剖析》

歡迎關注:

這裏寫圖片描述
相關文章
相關標籤/搜索