Java進階-解析Java中的多線程機制

來源:互聯網
上載者:User

標籤:tar   重要性   不能   單元   線上   增強   end   分組   電腦系統   

線程的狀態控制

在這裡需要明確的是:無論 採用繼承Thread類還是實現Runnable介面來實現應用程式的多線程能力,都需要在該類中定義用於完成實際功能的run方法,這個run方法稱為 線程體(Thread Body)。按照線程體在電腦系統記憶體中的狀態不同,可以將線程分為建立、就緒、運行、睡眠、掛起和死亡等類型。這些線程狀態類型下線程的特徵為:

建立狀態:當利用new關鍵字建立線程對象執行個體後,它僅僅作為一個對象執行個體存在,JVM沒有為其分配CPU時間片等線程運行資源;

就緒狀態:在處於建立狀態的線程中調用start方法將線程的狀態轉換為就緒狀態。這時,線程已經得到除CPU時間之外的其它系統資源,只等JVM的線程調度器按照線程的優先順序對該線程進行調度,從而使該線程擁有能夠獲得CPU時間片的機會。

睡眠狀態:線上程運行過程中可以調用sleep方法並在方法參數中指定線程的睡眠時間將線程狀態轉換為睡眠狀態。這時,該線程在不釋放佔用資源的情況下停止運行指定的睡眠時間。時間到達後,線程重新由JVM線程調度器進行調度和管理。

掛起狀態:可以通過調用suspend方法將線程的狀態轉換為掛起狀態。這時,線程將釋放佔用的所有資源,由JVM調度轉入臨時儲存空間,直至應用程式調用resume方法恢複線程運行。

死亡狀態:當線程體運行結束或者調用線程對象的stop方法後線程將終止運行,由JVM收回線程佔用的資源。

在Java線程類中分別定義了相應的方法,用於在應用程式中對線程狀態進行控制和管理。

線程的調度

線程調用的意義在於JVM應對啟動並執行多個線程進行系統級的協調,以避免多個線程爭用有限資源而導致應用系統死機或者崩潰。

為 了線程對於作業系統和使用者的重要性區分開,Java定義了線程的優先順序策略。Java將線程的優先順序分為10個等級,分別用1-10之間的數字表示。數字 越大表明線程的層級越高。相應地,在Thread類中定義了表示線程最低、最高和普通優先順序的成員變數MIN_PRIORITY、 MAX_PRIORITY和NORMAL_PRIORITY,代表的優先順序等級分別為1、10和5。當一個線程對象被建立時,其預設的線程優先順序是5。

為了控制線程的運行策略,Java定義了線程調度器來監控系統中處於就緒狀態的所有線程。線程調度器按照線程的優先順序決定那個線程投入處 理器運行。在多個線程處於就緒狀態的條件下,具有高優先順序的線程會在低優先順序線程之前得到執行。線程調度器同樣採用"搶佔式"策略來調度線程執行,即當前 線程執行過程中有較高優先順序的線程進入就緒狀態,則高優先順序的線程立即被調度執行。具有相同優先順序的所有線程採用輪轉的方式來共同分配CPU時間片。

在應用程式中設定線程優先順序的方法很簡單,在建立線程對象之後可以調用線程對象的setPriority方法改變該線程的運行優先順序,同樣可以調用getPriority方法擷取當前線程的優先順序。

在Java 中比較特殊的線程是被稱為守護(Daemon)線程的低層級線程。這個線程具有最低的優先順序,用於為系統中的其它對象和線程提供服務。將一個使用者線程設定 為守護線程的方式是線上程對象建立之前調用線程對象的setDaemon方法。典型的守護線程例子是JVM中的系統資源自動回收線程,它始終在低層級的狀 態中運行,用於即時監控和管理系統中的可回收資源。

線程分組管理

Java定義 了在多線程運行系統中的線程組(ThreadGroup)對象,用於實現按照特定功能對線程進行集中式分組管理。使用者建立的每個線程均屬於某線程組,這個 線程組可以線上程建立時指定,也可以不指定線程組以使該線程處於預設的線程組之中。但是,一旦線程加入某線程組,該線程就一直存在於該線程組中直至線程死 亡,不能在中途改變線程所屬的線程組。

當Java的Application應用程式運行時,JVM建立名稱為main的線程組。除非 單獨指定,在該應用程式中建立的線程均屬於main線程組。在main線程組中可以建立其它名稱的線程組並將其它線程加入到該線程組中,依此類推,構成線 程和線程組之間的樹型管理和繼承關係。

與線程類似,可以針對線程組對象進行線程組的調度、狀態管理以及優先順序設定等。在對線程組進行管理過程中,加入到某線程組中的所有線程均被看作統一的對象。

小結





本文針對Java平台中線程的性質和應用程式的多線程策略進行了分析和講解。與其它作業系統環境不同,Java運行環境中的線程類似於多使用者、多任務作業系統環境下的進程,但在進程和線程的運行及建立方式等方面,進程與Java線程具有明顯區別。

Unix 作業系統環境下,應用程式可以利用fork函數建立子進程,但子進程與該應用程式進程擁有獨立的地址空間、系統資源和代碼執行單元,並且進程的調度是由操 作系統來完成的,使得在應用進程之間進行通訊和線程協調相對複雜。而Java應用程式中的多線程則是共用同一應用系統資源的多個並行代碼執行體,線程之間 的通訊和協調方法相對簡單。

可以說:Java語言對應用程式多線程能力的支援增強了Java作為網路程式設計語言的優勢,為實現分布式應用系統中多用戶端的並發訪問以及提高伺服器的響應效率奠定堅實基礎。

Java進階-解析Java中的多線程機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.