中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

實現Runnable接口的多線程程序設計方法是什么

發布時間:2022-01-11 09:38:36 來源:億速云 閱讀:123 作者:柒染 欄目:編程語言

這篇文章將為大家詳細講解有關實現Runnable接口的多線程程序設計方法是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

實現Runnable接口的多線程程序設計方法
  Java語言中提供的另外一種實現多線程應用程序的方法是多線程對象實現Runnable接口并且在該類中定義用于啟動線程的run方法。這種定義方式的好處在于多線程應用對象可以繼承其它對象而不是必須繼承Thread類,從而能夠增加類定義的邏輯性。
  實現Runnable接口的多線程應用程序框架代碼如下所示:
  
  //Consumer.java
  import java.util.*;
  class Consumer implements Runnable
  {
   … …
  public Consumer(int nTime, String strConsumer){… …}
  public void run(){… …}
  static public void main(String args[])
  {
  Thread aConsumer = new Thread(new Consumer(1000, "aConsumer"));
  aConsumer.start();
  //其它對象實例的運行線程
   //… …
   }
  }
  
  從上述代碼可以看出:該類實現了Runnable接口并且在該類中定義了run方法。這種多線程應用程序的實現方式與繼承Thread類的多線程應用程序的重要區別在于啟動多線程對象的方法設計方法不同。在上述代碼中,通過創建Thread對象實例并且將應用對象作為創建Thread類實例的參數。

  線程間的同步
  
  Java應用程序的多個線程共享同一進程的數據資源,多個用戶線程在并發運行過程中可能同時訪問具有敏感性的內容。在Java中定義了線程同步的概念,實現對共享資源的一致性維護。下面以筆者最近開發的移動通信計費系統中線程間同步控制方法,說明Java語言中多線程同步方式的實現過程。
  
  在沒有多線程同步控制策略條件下的客戶賬戶類定義框架代碼如下所示:
  
  public class RegisterAccount
  {
  float fBalance;
  //客戶繳費方法
  public void deposit(float fFees){ fBalance += fFees; }
  //通話計費方法
  public void withdraw(float fFees){ fBalance -= fFees; }
  … …
  }
  
  
  
  
  讀者也許會認為:上述程序代碼完全能夠滿足計費系統實際的需要。確實,在單線程環境下該程序確實是可靠的。但是,多進程并發運行的情況是怎樣的呢?假設發生這種情況:客戶在客戶服務中心進行繳費的同時正在利用移動通信設備僅此通話,客戶通話結束時計費系統啟動計費進程,而同時服務中心的工作人員也提交繳費進程運行。讀者可以看到如果發生這種情況,對客戶賬戶的處理是不嚴肅的。
  
  如何解決這種問題呢?很簡單,在RegisterAccount類方法定義中加上用于標識同步方法的關鍵字synchronized。這樣,在同步方法執行過程中該方法涉及的共享資源(在上述代碼中為fBalance成員變量)將被加上共享鎖,以確保在方法運行期間只有該方法能夠對共享資源進行訪問,直到該方法的線程運行結束打開共享鎖,其它線程才能夠訪問這些共享資源。在共享鎖沒有打開的時候其它訪問共享資源的線程處于阻塞狀態。
  
  進行線程同步策略控制后的RegisterAccount類定義如下面代碼所示:
  
  public class RegisterAccount
  {
  float fBalance;
  public synchronized void deposit(float fFees){ fBalance += fFees; }
  public synchronized void withdraw(float fFees){ fBalance -= fFees; }
  … …
  }
  
  從經過線程同步機制定義后的代碼形式可以看出:在對共享資源進行訪問的方法訪問屬性關鍵字(public)后附加同步定義關鍵字 synchronized,使得同步方法在對共享資源訪問的時候,為這些敏感資源附加共享鎖來控制方法執行期間的資源獨占性,實現了應用系統數據資源的一致性管理和維護。



免費注冊
用戶登陸
幫助中心





Matrix首頁 Matrix動態 技術專欄 資源下載 精彩推薦 網站留言 用戶中心 Matrix論壇




今天是:2003年7月16日 星期三 您現在位于: 首頁 → 技術專欄 → java核心技術(java基礎技術)


JAVA教程:解析Java的多線程機制(5)
2003-6-7 Matrix讓你不斷進步 瀏覽選項: 顏色 默認 灰度 橄欖色 綠色 藍色 褐色 紅色 本文已被瀏覽 31 次



Java線程的管理
  
  
  線程的狀態控制
  
  在這里需要明確的是:無論采用繼承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線程具有明顯區別。
  Unix操作系統環境下,應用程序可以利用fork函數創建子進程,但子進程與該應用程序進程擁有獨立的地址空間、系統資源和代碼執行單元,并且進程的調度是由操作系統來完成的,使得在應用進程之間進行通信和線程協調相對復雜。而Java應用程序中的多線程則是共享同一應用系統資源的多個并行代碼執行體,線程之間的通信和協調方法相對簡單。
  可以說:Java語言對應用程序多線程能力的支持增強了Java作為網絡程序設計語言的優勢,為實現分布式應用系統中多客戶端的并發訪問以及提高服務器的響應效率奠定堅實基礎。

關于實現Runnable接口的多線程程序設計方法是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

留坝县| 息烽县| 新干县| 和平县| 上蔡县| 钦州市| 通江县| 麻城市| 开原市| 聂拉木县| 武强县| 庄浪县| 上林县| 北票市| 龙口市| 遂平县| 元朗区| 闽清县| 蓬安县| 沧州市| 灌南县| 濮阳县| 南阳市| 雅安市| 眉山市| 泰安市| 茶陵县| 海盐县| 江山市| 满城县| 甘谷县| 英山县| 嘉定区| 凭祥市| 辛集市| 思南县| 开鲁县| 渝北区| 枣强县| 临沭县| 镇康县|