java多線程的調度策略
阿新 • • 發佈:2018-03-15
放棄 分配 結束 blank 阻塞 線程調度 nbsp 個人 post
兩種線程的調度模式:
搶占式調度:
搶占式調度指的是每條線程執行的時間、線程的切換都由系統控制,系統控制指的是在系統某種運行機制下,可能每條線程都分同樣的執行時間片,也可能是某些線程執行的時間片較長,甚至某些線程得不到執行的時間片。在這種機制下,一個線程的堵塞不會導致整個進程堵塞。
協同式調度:
協同式調度指某一線程執行完後主動通知系統切換到另一線程上執行,這種模式就像接力賽一樣,一個人跑完自己的路程就把接力棒交接給下一個人,下個人繼續往下跑。線程的執行時間由線程本身控制,線程切換可以預知,不存在多線程同步問題,但它有一個致命弱點:如果一個線程編寫有問題,運行到一半就一直堵塞,那麽可能導致整個系統崩潰。
JVM的實現:
JVM規範中規定每個線程都有優先級,且優先級越高越優先執行,但優先級高並不代表能獨自占用執行時間片,可能是優先級高得到越多的執行時間片,反之,優先級低的分到的執行時間少但不會分配不到執行時間。
java使用的線程調度式搶占式調度
Java中線程會按優先級分配CPU時間片運行
線程讓出cpu的情況:
-
當前運行線程主動放棄CPU,JVM暫時放棄CPU操作(基於時間片輪轉調度的JVM操作系統不會讓線程永久放棄CPU,或者說放棄本次時間片的執行權),例如調用yield()方法。
-
當前運行線程因為某些原因進入阻塞狀態,例如阻塞在I/O上。
-
當前運行線程結束,即運行完run()方法裏面的任務。
java多線程的調度策略