解析Java的多執行緒機制(1)(轉)

ba發表於2007-08-15
解析Java的多執行緒機制(1)(轉)[@more@]程式與應用程式的區別
  
  程式(Process)是最初定義在Unix等多使用者、多工作業系統環境下用於表示應用程式在記憶體環境中基本執行單元的概念。以Unix作業系統為例,程式是Unix作業系統環境中的基本成分、是系統資源分配的基本單位。Unix作業系統中完成的幾乎所有使用者管理和資源分配等工作都是透過作業系統對應用程式程式的控制來實現的。
  
  C、C++、Java等語言編寫的源程式經相應的編譯器編譯成可執行檔案後,提交給計算機處理器執行。這時,處在可執行狀態中的應用程式稱為程式。從使用者角度來看,程式是應用程式的一個執行過程。從作業系統核心角度來看,程式代表的是作業系統分配的記憶體、CPU時間片等資源的基本單位,是為正在執行的程式提供的執行環境。程式與應用程式的區別在於應用程式作為一個靜態檔案儲存在計算機系統的硬碟等儲存空間中,而程式則是處於動態條件下由作業系統維護的系統資源管理實體。多工環境下應用程式程式的主要特點包括:
  
  ●程式在執行過程中有記憶體單元的初始入口點,並且程式存活過程中始終擁有獨立的記憶體地址空間;
  
  ●程式的生存期狀態包括建立、就緒、執行、阻塞和死亡等型別;
  
  ●從應用程式程式在執行過程中向CPU發出的執行指令形式不同,可以將程式的狀態分為使用者態和核心態。處於使用者態下的程式執行的是應用程式指令、處於核心態下的應用程式程式執行的是作業系統指令。
  
  在Unix作業系統啟動過程中,系統自動建立swapper、init等系統程式,用於管理記憶體資源以及對使用者程式進行排程等。在Unix環境下無論是由作業系統建立的程式還要由應用程式執行建立的程式,均擁有唯一的程式標識(PID)。

程式與Java執行緒的區別
  
  
  應用程式在執行過程中存在一個記憶體空間的初始入口點地址、一個程式執行過程中的程式碼執行序列以及用於標識程式結束的記憶體出口點地址,在程式執行過程中的每一時間點均有唯一的處理器指令與記憶體單元地址相對應。
  
  Java語言中定義的執行緒(Thread)同樣包括一個記憶體入口點地址、一個出口點地址以及能夠順序執行的程式碼序列。但是程式與執行緒的重要區別在於執行緒不能夠單獨執行,它必須執行在處於活動狀態的應用程式程式中,因此可以定義執行緒是程式內部的具有併發性的順序程式碼流。
  
  Unix作業系統和Microsoft Windows作業系統支援多使用者、多程式的併發執行,而Java語言支援應用程式程式內部的多個執行執行緒的併發執行。多執行緒的意義在於一個應用程式的多個邏輯單元可以併發地執行。但是多執行緒並不意味著多個使用者程式在執行,作業系統也不把每個執行緒作為獨立的程式來分配獨立的系統資源。程式可以建立其子程式,子程式與父程式擁有不同的可執行程式碼和資料記憶體空間。而在用於代表應用程式的程式中多個執行緒共享資料記憶體空間,但保持每個執行緒擁有獨立的執行堆疊和程式執行上下文(Context)。
  
  基於上述區別,執行緒也可以稱為輕型程式 (Light Weight Process,LWP)。不同執行緒間允許任務協作和資料交換,使得在計算機系統資源消耗等方面非常廉價。
  
  執行緒需要作業系統的支援,不是所有型別的計算機都支援多執行緒應用程式。Java程式設計語言將執行緒支援與語言執行環境結合在一起,提供了多工併發執行的能力。這就好比一個人在處理家務的過程中,將衣服放到洗衣機中自動洗滌後將大米放在電飯鍋裡,然後開始做菜。等菜做好了,飯熟了同時衣服也洗好了。
  
  需要注意的是:在應用程式中使用多執行緒不會增加 CPU 的資料處理能力。只有在多CPU 的計算機或者在網路計算體系結構下,將Java程式劃分為多個併發執行執行緒後,同時啟動多個執行緒執行,使不同的執行緒執行在基於不同處理器的Java虛擬機器中,才能提高應用程式的執行效率。

  另外,如果應用程式必須等待網路連線或資料庫連線等資料吞吐速度相對較慢的資源時,多執行緒應用程式是非常有利的。基於Internet的應用程式有必要是多執行緒型別的,例如,當開發要支援大量客戶機的伺服器端應用程式時,可以將應用程式建立成多執行緒形式來響應客戶端的連線請求,使每個連線使用者獨佔一個客戶端連線執行緒。這樣,使用者感覺伺服器只為連線使用者自己服務,從而縮短了伺服器的客戶端響應時間。
  
  
  Java語言的多執行緒程式設計方法
  
  
  利用Java語言實現多執行緒應用程式的方法很簡單。根據多執行緒應用程式繼承或實現物件的不同可以採用兩種方式:一種是應用程式的併發執行物件直接繼承Java的執行緒類Thread;另外一種方式是定義併發執行物件實現Runnable介面。
  
  繼承Thread類的多執行緒程式設計方法
  
  Thread 類是JDK中定義的用於控制執行緒物件的類,在該類中封裝了用於進行執行緒控制的方法。見下面的示例程式碼:
  
  //Consumer.java
  import java.util.*;
  class Consumer extends Thread
  {
   int nTime;
   String strConsumer;
   public Consumer(int nTime, String strConsumer)
   {
   this.nTime = nTime;
   this.strConsumer = strConsumer;
   }
   public void run()
   {
  while(true)
  {
   try
  {
   System.out.println("Consumer name:"+strConsumer+" ");
   Thread.sleep(nTime);
   }
  catch(Exception e)
  {
   e.printStackTrace();
   }
  }
   }
  static public void main(String args[])
  {
   Consumer aConsumer = new Consumer (1000, "aConsumer");
   aConsumer.start();
   Consumer bConsumer = new Consumer (2000, "bConsumer");
   bConsumer.start();
   Consumer cConsumer = new Consumer (3000, "cConsumer ");
   cConsumer.start();
  }
  }
    
  從上面的程式程式碼可以看出:多執行緒執行地下Consumer繼承Java語言中的執行緒類Thread並且在main方法中建立了三個 Consumer物件的例項。當呼叫物件例項的start方法時,自動呼叫Consumer類中定義的run方法啟動物件執行緒執行。執行緒執行的結果是每間隔nTime時間列印出物件例項中的字串成員變數strConsumer的內容。
  
  可以總結出繼承Thread類的多執行緒程式設計方法是使應用程式類繼承Thread類並且在該類的run方法中實現併發性處理過程。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958448/,如需轉載,請註明出處,否則將追究法律責任。

相關文章