熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

淺析Java多線程程序設計機制

2013-11-23 19:57:54  來源: Java高級技術 

  多線程是Java語言的一大特性多線程就是同時存在N個執行體按幾條不同的執行線索共同工作的情況程序進程線程可以從不同的角度去理解程序就是一段靜態的代碼可以理解成一組計算機命令的集合進行就是這個程序一次動態的執行過程從代碼的加載到執行完畢的一個過程線程是一個比進程小的單位一個進程再執行的過程中可以產生多個線程每個線程也是由生產到銷毀可以理解成是進行的子集我個人用一個覺得還算恰當的比喻來比喻三者QQ客戶端就是一個程序登陸一個QQ就是開始了這個程序的一個進程再QQ上發送消息給好友就貌似這個進程中的一個線程不知道這樣比喻恰當否?

  線程也是有狀態和聲明周期的每個Java程序都會有一個缺省的主線程對於應用程序applcation來說main方法就是一個主線程Java語言使用的是Thread類及其子類的對象來表示線程的創建一個新的線程的生命周期如下狀態:

  ) 新建:當一個Thread類或者其子類的對象被聲明並創建時新的線程對象處於新建狀態此時它已經有了相應的內存空間和其他資源

  ) 就緒:處於新建狀態的線程被啟動後將進入線程隊列排隊等待CUP服務這個時候具備了運行的條件一旦輪到CPU的時候就可以脫離創建它的主線程獨立開始自己的生命周期

  ) 運行:就緒的線程被調度並獲得CUP的處理邊進入了運行狀態每一個Thread類及其子類的對象都有一個重要的run()方法當線程對象被調度執行的時候它將自動調用本對象的run()方法從第一句代碼開始執行所以說對線程的操作應該寫到run()方法中

  ) 阻塞:一個正在執行的線程如果再某種情況下不能執行了進入阻塞狀態這個時候它不能進入排隊狀態只有引起了阻塞的原因消失的時候線程才可以繼續進入排隊狀態等待CUP處理

  ) 死亡:處於死亡狀態的線程不具有繼續執行的能力線程死亡主要的原因是正常運行的線程完成了全部工作即執行完了run()方法另外就是被提前強制的終止了

  線程的調度也是有優先級別的就是說同樣的排列優先級高可以提前被CPU處理主要分三個級別高中低分別代表的數字是分別有三個常量代表不可以被改變最小優先級的常量是MIN_PRIORITY普通的優先級的常量是NORM_PRIORITY最高的優先級的常量是MAX_PRIORITY一般主線程的優先級是普通另外可以通過Thread類的setPriority(int a)方法來修改系統自動設置的線程優先級

  Java中編程實現多線程應有兩種途徑一種是創建自己的線程子類另外是實現一個接口Runnable無論是那種途徑最終讀需要使用Thread類及其方法Thread類有兩種構造方法public Thread()用來創建一個線程對象public Thread(Runnable r)創建線程對象參數r成為被創建的目標對象這個目標必須實現Runnbale接口給出該接口的run()方法的方法體再方法體中操作用兩個構造方法創建完的線程就是一個新建的狀態等待處理然後啟動線程的start()方法啟動線程對象線程進入排隊狀態也就是就緒狀態然後線程操作run()方法這個方法裡的內容是被系統處理的內容如果想使線程進入休眠狀態可以調用sleep()方法可以給一個參數代表休眠的毫秒如果給兩個參數代表那秒終止線程用yield()方法來完成判斷線程是否銷毀可以用idAlive()方法判斷線程是否活著Runnable接口只有一個方法run()方法我們實現這個接口把要操作的代碼寫到這個方法中然後再把實現了整個接口的類的實例傳給Therad類的構造方法即可操作線程

  線程同步是一個再處理線程的時候需要注意的問題同步方法要用synchronized關鍵字類修飾被這個關鍵字修飾後當一個線程A使用這個方法後其它線程想使用這個方法就必須等待知道線程A使用完該方法後方可使用下面我寫一個例子來說明線程同步這個例子有兩個線程會計和出納他們共同有一個賬本他們倆都可以存取方法對賬本進行訪問會計使用存取方法的時候寫入存錢的記錄出納則寫入取錢的記錄因此會計使用賬本的時候出納被禁止使用反之也是如此就是一個人使用另外一個人必須等待下面我通過一個小程序Applet來實現這個事:

  import Javaapplet*;
  import Javaawt*;
  import Javaawtevent*;

  public class MyThread extends Applet implements Runnable
  {
   int money = ;
   TextArea text = null;
   TextArea text = null;
   Thread Kuaiji = null;
   Thread Chuna = null;
   public void init()
   {
    Kuaiji = new Thread(this);
    Chuna = new Thread(this);
    text = new TextArea();
    text = new TextArea();
    add(text);
    add(text);
   }
   public void start()
   {
    Kuaijistart();
    Chunastart();
   }
   public synchronized void Cunqu(int number)
   {
    if(ThreadcurrentThread() == Kuaiji)
    {
     for(int i=;i<=;i++)
     {
      money = money + number;
      try {Threadsleep();}
      catch(Exception e){}
      textappend(\n+money);
     }
    }
    else if(ThreadcurrentThread() == Chuna)
    {
     for(int i=;i<=;i++)
     {
      money = money number/;
      try {Threadsleep();}
      catch(Exception e){}
      textappend(\n+money);
     }
    }
   }
   public void run()
   {
    if(ThreadcurrentThread()==Kuaiji || ThreadcurrentThread()==Chuna)
    {
     for(int i=;i<=;i++)
     {
      Cunqu();
     }
    }
   }
  }

  當一個線程使用同步方法中的某個變量而此變量又需要其他線程修改後才能符合本線程的需要那麼可以再同步方法中使用wait()方法使本線程等待並允許其他線程使用這個同步方法用notfyAll()方法同志所有的由於使用這個同步方法的處於等待的線程結束等待進入同步方法中運行如果使使用notfy()就是單獨同志一個線程進行同步方法進行活動簡單的理解就是wait()方法讓線程等待notfy()當一個線程運行notfyAll()讓全部線程運行雖然Java支持多線程一般線程不需要我們自己處理但是也是需要了解和掌握的再日後的項目中獲取會根據不同情況有不同的需求


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27739.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.