執行緒排程一般指的是系統為執行緒分配處理器使用權的過程,這個過程會產生上下文切換,即作業系統的CPU利用時間片輪轉的方式給每個任務分配一定的執行時間,然後把當前任務狀態儲存下來,接著載入下一任務的狀態並執行,它是一個狀態儲存與載入的過程。
一般執行緒排程模式分為兩種——搶佔式排程和協同式排程。
搶佔式排程指的是每條執行緒執行的時間、執行緒的切換都由系統控制,執行緒的切換不由執行緒本身決定,系統控制指的是在系統某種執行機制下,可能每條執行緒都分同樣的執行時間片,也可能是某些執行緒執行的時間片較長,甚至某些執行緒得不到執行的時間片。在這種機制下,一個執行緒的堵塞不會導致整個程式堵塞。
協同式排程指某一執行緒執行完後主動通知系統切換到另一執行緒上執行,執行緒的執行時間由執行緒本身控制,這種模式就像接力賽一樣,一個人跑完自己的路程就把接力棒交接給下一個人,下個人繼續往下跑。執行緒的執行時間由執行緒本身控制,執行緒切換可以預知,不存在多執行緒同步問題,但它有一個致命弱點:如果一個執行緒編寫有問題,執行到一半就一直堵塞,那麼可能導致整個系統崩潰。
左邊為搶佔式執行緒排程,假如三條執行緒需要執行,處理器執行的路徑是線上程一執行一個時間片後強制切換到執行緒二執行一個時間片,然後切到執行緒三,再回到執行緒一,如此迴圈直至三條執行緒都執行完。而協同式執行緒排程則不這樣走,它會先將執行緒一執行完,執行緒一再通知執行緒二執行,執行緒二再通知執行緒三,直到執行緒三執行完。
Java使用的是哪種執行緒排程模式?此問題涉及到JVM的實現,JVM規範中規定每個執行緒都有優先順序,且優先順序越高越優先執行,但優先順序高並不代表能獨自佔用執行時間片,可能是優先順序高得到越多的執行時間片,反之,優先順序低的分到的執行時間少但不會分配不到執行時間。JVM的規範沒有嚴格地給排程策略定義,一般Java使用的執行緒排程是搶佔式排程,在JVM中體現為讓可執行池中優先順序高的執行緒擁有CPU使用權,如果可執行池中執行緒優先順序一樣則隨機選擇執行緒,但要注意的是實際上一個絕對時間點只有一個執行緒在執行(這裡是相對於一個CPU來說),直到此執行緒進入非可執行狀態或另一個具有更高優先順序的執行緒進入可執行執行緒池,才會使之讓出CPU的使用權。
-------------推薦閱讀------------
跟我交流,向我提問:
公眾號的選單已分為“讀書總結”、“分散式”、“機器學習”、“深度學習”、“NLP”、“Java深度”、“Java併發核心”、“JDK原始碼”、“Tomcat核心”等,可能有一款適合你的胃口。
歡迎關注: