更新時間:2020-11-24 17:29:39 來源:動力節點 瀏覽1266次
在Java多線程環境中,為保證所有線程的執行能按照一定的規則執行,JVM實現了一個線程調度器,它定義了線程調度的策略,對于CPU運算的分配都進行了規定,按照這些特定的機制為多個線程分配CPU的使用權。Java線程調度是Java多線程的核心,只有良好的調度,才能充分發揮系統的性能,提高程序的執行效率。
線程調度是指系統為線程分配處理器使用權的過程,Java使用的線程調度方式就是搶占式調度,線程調度主要方式有兩種:
1.協同式 (Cooperative Threads-Scheduling)線程調度:
使用協同式調度的多線程系統,線程的執行時間由線程本身來控制,線程把自己的工作執行完了之后,要主動通知系統切換到另外一個線程上去。協同式多線程的最大好處是實現簡單,而且由于線程要把自己的事情干完后才會進行線程切換,切換操作對線程自己是可知的,所以一般沒有什么 線程同步的問題。它的壞處也很明顯:線程執行時間不可控制,甚至如果一個線程的代碼編寫有問題,一直不告知系統進行線程切換,那么程序就會一直阻塞在那里。
2.搶占式(Preemptive Threads-Scheduling)線程調度
使用搶占式調度的多線程系統,那么每個線程將由系統來分配執行時間,線程的切換不由 程本身來決定。譬如在Java中,有Thread::yield()方法可以主動讓出執行時間,但是如果想要主動獲取執行時間,線程本身是沒有什么辦法的。在這種實現線程調度的方式下,線程的執行時間是系統可控的,也不會有一個線程導致整個進程甚至整個系統阻塞的問題。
在了解了兩種線程調度模式后,現在考慮Java使用的是哪種線程調度模式。此問題的討論涉及到JVM的實現,JVM規范中規定每個線程都有優先級,且優先級越高越優先執行,但優先級高并不代表能獨自占用執行時間片,可能是優先級高得到越多的執行時間片,反之,優先級低的分到的執行時間少但不會分配不到執行時間。JVM的規范沒有嚴格地給調度策略定義,我想正是因為面對眾多不同調度策略,JVM要封裝所有細節提供一個統一的策略不太現實,于是給了一個不嚴謹但足夠統一的定義。回到問題上,Java使用的線程調度是搶占式調度,在JVM中體現為讓可運行池中優先級高的線程擁有CPU使用權,如果可運行池中線程優先級一樣則隨機選擇線程,但要注意的是實際上一個絕對時間點只有一個線程在運行(這里是相對于一個CPU來說,如果你的機器是多核的還是可能多個線程同時運行的),直到此線程進入非可運行狀態或另一個具有更高優先級的線程進入可運行線程池,才會使之讓出CPU的使用權,更高優先級的線程搶占了優先級低的線程的CPU。
Java的線程的調度機制都由JVM實現,假如有若干條線程,你想讓某些線程擁有更長的執行時間,或某些線程分配少點執行時間,這時就涉及“線程優先級”。由于JVM的實現以宿主操作系統為基礎,所以Java優先級值與各種不同操作系統的原生線程優先級必然存在某種映射關系,這樣才足以封裝所有操作系統的優先級提供統一優先級語義。
Java線程調度策略決定上層多線程運行機制,JVM的線程調度器實現了搶占式調度,每條線程執行的時間由它分配管理,它將按照線程優先級的建議對線程執行的時間進行分配,優先級越高,可能得到CPU的時間則越長。但是,不管程序員怎么編寫調度,只能最大限度的影響線程執行的次序,而不能做到精準控制。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習