執行緒 threads

achan2090發表於2007-09-09

執行緒是認證考試中考的最多的一部分
簡單的說,就是一個程式它可以有好幾個分身在電腦中執行。

1.程式與執行緒
程式:執行中的程式叫做程式,即當程式執行時的這個動態過程就是一個程式。
      在電腦中同一個份程式可以執行好幾個,就是說好幾個工作相同的程式在電腦中執行。
執行緒:相同的程式碼產生好幾個程式,有個問題就是一些東西重複浪費,一樣的程式程式碼總有能夠共用的程式碼、常量等。
   threads就是使同一份程式產生好幾個程式的效果,不同的threads之間能夠達到某種程度的資源共享,threads是輕量級的程式。
  
  
2.Java中負責threads功能是類是:java.lang.Threads  
  實現方式有兩種:一是繼承;二是介面
   
    1)繼承——這種方式比較單一簡單,因為java的類只能單一繼承,繼承了Threads類,就無法繼承別的類了
    2)介面——實現Runnable介面,符合物件導向設計精神,可以繼承多個介面  
  
 繼承:Hello1.java
 public class Hello1 extends Threads
 {
  String name ;
  public Hello1 (String n)
  {
   name = n ;
  }
  public void run()
  {
   for(int i = 1 ; i <= 10 ;i++)
   {
    System.out.println(name + "Hello" + i)
   }
  }
 } 
  
 介面:Hello2.java
 public class Hello2 implement Runnable
 {
  String name ;
  public Hello2 (String n)
  {
   name = n ;
  }
  public void run()
  {
   for(int i = 1 ; i <= 10 ;i++)
   {
    System.out.println(name + "Hello" + i)
   }
  }
 }   
  
  
 執行執行緒:
 public class ThreadsExample
 {
  public static void main(String argv[])
  {
   Hello1 h1 = new Hello1("Threads1") ; 建立類物件例項
   Threads t1 = new Threads(h1) ; 建立執行緒物件例項
   t1.start() ; 執行執行緒
  
   //Hello2的執行同上
   //main本身也是一個Threads
  }
  
 }  
  
 停止執行緒:
 public void run()
 {
  int i = 0 ;
  while(!isStop)
  {
   i++ ;
   System.out.println(name + "Hello" + i)
  }
  public void stop()
  {
   isStop = true ;
  }
 } 
 新增了一個isStop屬性用於控制迴圈條件,一但停止了執行緒將無法恢復,只能重新產生另一個Threads物件 
  
 暫停Threads執行:
 1)sleep
 數字鐘例項MyClock.java
 public void run()
 {
  while(true)
  {
   try
   {
    Thread.sleep(1000);
    time.setText(getTime) ;
   }
   catch
   {
    System.err.println(e);
   }
  }
 }
 Threads物件睡醒後,程式等待執行狀態,而不是立刻執行狀態 
  
 2)yield
 
 讓Threads物件立刻暫時停止執行,並且直接從執行狀態轉移到等待執行狀態
 
 3)join
 
 當一個系統中有好幾個Threads在執行,有時候某個Threads甲需要等待另外一個Threads乙完成某件事情後,甲才能繼續執行下去,這時甲在乙還沒有執行能夠完成之前,就必須要做等待的工作 
  
3.鎖 
 多個執行緒之間共享一些資源物件,例如銀行帳號在各賬戶之間轉移賬目,各賬戶資料就是共享資源物件;撲克遊戲、棋子游戲中各個玩家對撲克棋子不斷進行操作,這些撲克和棋子就是共享資源物件

 Java中用關鍵字synchronized為共享資源加鎖。用synchronized修飾一個物件時,在任何一個時刻只能有一個執行緒訪問,即只能有一個執行緒能取得加鎖物件的鑰匙,對加鎖物件進行操作,只有該執行緒操作完畢後,其他執行緒才能訪問該物件,進行操作,從而達到對共享資源訪問的保護。


 給物件加鎖的方式有2種:1是給方法加鎖,2是給方法體中的某些物件加鎖
 1)
 public synchronized 返回值型別 方法名(引數列表)
 {
  ...;
  //定義處理共享資源列表
 }

 2)
 public 返回值型別 方法名(引數列表)
 {
  ...;//定義對非共享資源的訪問
  synchronized(this) //定義對共享資源的訪問
  {
   ...; //被加鎖的某些共享的物件或資料
  } 
 }

 鎖的喚醒:執行緒同步和喚醒方法
 wait()方法使執行緒一直等待下去
 wait(1000)方法使執行緒等待1000毫秒後又成為就緒狀態
 notify()方法喚醒沒有指定等待時間的執行緒
 notifyAll()使用者喚醒多個執行了wait()方法而等待的執行緒

 方法wait()和sleep()和suspend()方法一樣,都能使執行緒等待而停止執行,其區別在於sleep()方法和suspend()方法不會釋放物件的鎖,而wait()方法進入等待時,可是釋放物件的鎖
 
 另外還有三種方式也會把鎖釋放:1是用break語句跳離鎖定語句塊,這對synchronized宣告的方法無作用;2是遇到return語句;3是遇到異常

 簡單預防死鎖的辦法就是給每個鎖加上優先順序 

相關文章