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