Java核心知識 多線程併發 Java中用到的線程調度 (三十一)


Java核心知識 多線程併發 Java中用到的線程調度 (三十一)

1. 搶佔式調度:

搶佔式調度指的是每條線程執行的時間、線程的切換都由系統控制,系統控制指的是在系統某種 運行機制下,可能每條線程都分同樣的執行時間片,也可能是某些線程執行的時間片較長,甚至 某些線程得不到執行的時間片。在這種機制下,一個線程的堵塞不會導致整個進程堵塞。

2. 協同式調度:

協同式調度指某一線程執行完後主動通知系統切換到另一線程上執行,這種模式就像接力賽一樣, 一個人跑完自己的路程就把接力棒交接給下一個人,下個人繼續往下跑。線程的執行時間由線程 本身控制,線程切換可以預知,不存在多線程同步問題,但它有一個致命弱點:如果一個線程編 寫有問題,運行到一半就一直堵塞,那麼可能導致整個系統崩潰。


Java核心知識 多線程併發 Java中用到的線程調度 (三十一)

3. JVM 的線程調度實現(搶佔式調度)

java 使用的線程調使用搶佔式調度,Java 中線程會按優先級分配 CPU 時間片運行,且優先級越高 越優先執行,但優先級高並不代表能獨自佔用執行時間片,可能是優先級高得到越多的執行時間 片,反之,優先級低的分到的執行時間少但不會分配不到執行時間。

4. 線程讓出 cpu 的情況:

1). 當前運行線程主動放棄 CPU,JVM 暫時放棄 CPU 操作(基於時間片輪轉調度的 JVM 操作系 統不會讓線程永久放棄 CPU,或者說放棄本次時間片的執行權),例如調用 yield()方法。

2). 當前運行線程因為某些原因進入阻塞狀態,例如阻塞在 I/O 上。

3). 當前運行線程結束,即運行完 run()方法裡面的任務。


分享到:


相關文章: