Java與線程

線程的實現

線程是比進程更輕量級的調度執行單位,線程的引入,可以把一個進程的資源和執行調度分開,各個線程即可以共享進程資源(內存地址、文件I/O),又可以獨立調度(線程是CPU調度的基本單位),Thread類的大部分方法爲native方法

實現線程主要有三種方式:內核線程實現、使用用戶線程實現、使用用戶線程加輕量級進程混合實現

  • 內核線程實現(輕量級進程)
    內核線程:即直接有操作系統支持的線程,這種線程由內核完成線程切換,內核通過操縱調度器對線程進行調度,並負責將任務映射到各個處理器上。每個線程可以視作內核的一個分身,以此實現多處理
    輕量級進程優點:內核線程的高級接口,與內核線程存在一對一關係,其實現必須建立與內核線程基礎之上
    輕量級進程缺點:①基於內核線程實現,各種創建、析構、同步都需要進行系統調用,而系統調用代價過高,且需要平凡內核態和用戶態切換②每個線程都需要內核線程支持,系統支持數量有限
    在這裏插入圖片描述
  • 用戶線程實現:用戶的建立、同步、銷燬和調度完全在用戶態中進行,不需要內核的幫助。如果實現得當,這種線程不需要切換到內核態,因此切換消耗低。是一種進程與線程的一對多模型
    優點:不需要系統內核支援,消耗低
    缺點:無內核支援,所有的線程操作都需要用戶程序自己處理,實現困難(阻塞處理、多處理器系統線程與處理器的映射等)。
    在這裏插入圖片描述
  • 現用戶線程加輕量級進程混合實現:將內核線程與用戶線程一起使用的方式。該模式下即存在用戶線程亦存在輕量級進程。內核線程與內核處理器之間存在多對多關係,內核線程與輕量級進程存在一對一關係,輕量級進程與用戶線程存在多對多關係
    優點:線程的創建、切換、析構等操作依然由用戶控件實現,調用廉價;而複雜的內核線程調度以及處理器映射則交由內核提供的輕量級進程完成,大大降低整個進程被完全阻塞的風險。
    在這裏插入圖片描述
  • java線程的實現
    java線程在jdk1.2之前是基於用戶線程實現,而在jdk1.2中,線程模型替換爲基於操作系統原生線程模型實現。因此目前不同版本中的線程模型不統一,虛擬機規範也未限定使用哪種模型。

Java線程調度方式:協同式調度與搶佔式調度

  • 協同式調度:線程的執行時間由線程自身控制,線程可以將自己的任務執行完畢後,再(要主動)通知系統切換到其它線程。
    優點:實現簡單,沒有什麼線程同步問題(把本線程任務執行完畢纔會交出CPU)
    缺點:線程執行時間不可控,線程未通知系統任務完畢,將導致長時間佔用
  • 搶佔式調度:每個線程的執行時間由系統決定,線程的切換不需要線程決定。
    優點:線程的執行時間是可控的,不會由於一個線程導致整個系統長期阻塞的特點
    優先級特性:可以通過線程優先級設定,給線程多一些執行時間,java中的Thread有10個優先級,但是優先級還有取決於具體的操作系統,若操作系統線程優先級少就會出現幾個Thread優先級對應一個系統優先級的情況,且根據不同的操作系統實現,即使線程的優先級被設定,也可能被操作系統更改,例如長期等待的線程可能優先級被系統自動提升

狀態轉換:新建(new)、運行(Runable)、無限期等待(Waiting)、限期等待(Time waiting)、阻塞(Blocked)、結束(Terminated)

  • 新建(new):創建後尚未啓動的線程
  • 運行(Runable):處於就緒和正在運行中的狀態
  • 無限期等待(Waiting):這種狀態下不會分配CPU,需要其它線程喚醒。
    Object.wait()方法:沒有設置Timeout參數的
    Thread.join()方法:沒有設置Timeout參數的
  • 限期等待(Time waiting):處於這種狀態的線程也不會被分配CPU執行時間,不過無需等待被其它線程顯式的喚醒,在一定時間之後它們會由系統自動喚醒。
    以下方法會進入限期等待狀態:
    Thread.sleep()方法:
    Object.wait()方法:設置了Timeout參數的
    Object.join()方法:設置了Timeout參數的
    • 阻塞(Blocked):線程被阻塞了,在線程等待進入同步區域的時候,線程將進入阻塞狀態。
      “阻塞狀態”:在等待一個排他鎖,這個事件將在另外一個線程放棄這個鎖的時候發生。
      “等待狀態”:則是在等待一段事件,或者喚醒動作的發生。
  • 結束(Terminated):已終止的線程狀態
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章