JAVA內存模型與線程(二)

JAVA線程調度

  • 協同式線程調度

    線程的執行時間由線程本身來控制,線程把自己的工作執行完了之後,要主動通知系統切換到另外一個線程上。優點:實現簡單。缺點:執行時間不可控制。

  • 搶佔式線程調度

    每個線程由系統分配執行時間,線程的切換不由線程本身決定。Java使用的就是這種線程調度方式。在這種實現線程調度的方式下,線程的執行時間是系統可控的,不會有一個線程導致整個進程阻塞的問題。

    Java提供10個級別的線程優先級設置,來讓某個線程可以分配多一點的執行時間,不過Java線程是被映射到系統的原生線程上實現的,所以線程調度最終還是由操作系統決定

狀態轉移

  • 新建(New):創建尚未啓動的線程處於這種狀態。

  • **運行(Runable):**包括操作系統線程狀態中的Running和Ready,處於此狀態的線程可能正在運行,也可能等待着CPU爲它分配執行時間。

  • **無限期等待(Waiting):**處於這種狀態的線程不會被分配CPU執行時間,它們要等待其他線程顯示地喚醒。以下方法會讓線程陷入無限期的等待狀態:

    ​ 沒有設置Timeout參數的Object.wait()方法。

​ 沒有設置Timeout參數的Thread.join()方法。

​ LockSupport.park()方法。

  • **限期等待(Timed Waiting):**處於這種狀態的線程也不會被分配CPU執行時間,不過無須等待被其他線程顯示地喚醒,在一定時間後由系統自動喚醒。以下方法會讓線程陷入限期的等待狀態:

    ​ Thread.sleep()方法。

​ 設置了Timeout參數的Object.wait()方法。

​ 設置了Timeout參數的Thread.join()方法。

​ LockSupport.parkNanos()方法。

​ LockSupport.parkUntil()方法。

  • **阻塞(Blocked):線程被阻塞了,“阻塞狀態”與“等待狀態”的區別是:“阻塞狀態”在等待獲取一個排它鎖,這個事件將在另外一個線程放棄這個鎖的時候發生;“等待狀態”則是在等待一段時間,或者喚醒動作的發生。**在程序進入等待進入同步塊區域的時候,線程將進入這種狀態。

  • **結束(Terminated):**已終止線程的線程狀態,線程已經結束執行。
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章