1. 程式人生 > >在java中怎樣實現多線程?線程的4種狀態

在java中怎樣實現多線程?線程的4種狀態

靈活運用 習慣 資料 class 額外 決定 des 效果 自己

一、在java中怎樣實現多線程?

extends Thread

implement Runnable

方法一:繼承 Thread 類,覆蓋方法 run(),我們在創建的 Thread 類的子類中重寫 run() ,加入線程所要執行的代碼即可。

下面是一個例子:

 

 public class MyThread extends Thread

  {

   int count= 1, number;

   public MyThread(int num)

   {

    number = num;

    System.out.println

    ("創建線程 " + number);

   }

   
public void run() {     while(true) {      System.out.println       ("線程 " + number + ":計數 " + count);      if(++count== 6) return;     }   }   public static void main(String args[])   {    for(int i = 0;i 〈 5; i++) new MyThread(i+1).start();   }  } *上海尚學堂Java培訓 shsxt.com

  

  這種方法簡單明了,符合大家的習慣,但是,它也有一個很大的缺點,那就是如果我們的類已經從一個類繼承(如小程序必須繼承自

Applet 類),則無法再繼承 Thread 類,這時如果我們又不想建立一個新的類,應該怎麽辦呢?

  我們不妨來探索一種新的方法:我們不創建Thread類的子類,而是直接使用它,那麽我們只能將我們的方法作為參數傳遞給 Thread 類的實例,有點類似回調函數。但是 Java 沒有指針,我們只能傳遞一個包含這個方法的類的實例。

  那麽如何限制這個類必須包含這一方法呢?當然是使用接口!(雖然抽象類也可滿足,但是需要繼承,而我們之所以要采用這種新方法,不就是為了避免繼承帶來的限制嗎?)

  Java 提供了接口 java.lang.Runnable 來支持這種方法。

  方法二:實現

Runnable 接口

  Runnable接口只有一個方法run(),我們聲明自己的類實現Runnable接口並提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務。但是Runnable接口並沒有任何對線程的支持,我們還必須創建Thread類的實例,這一點通過Thread類的構造函數 public Thread(Runnable target);來實現。下面是一個例子:

  

public class MyThread implements Runnable

  {

   int count= 1, number;

   public MyThread(int num)

   {

    number = num;

    System.out.println("創建線程 " + number);

   }

   public void run()

   {

    while(true)

    {

     System.out.println

     ("線程 " + number + ":計數 " + count);

     if(++count== 6) return;

    }

   }

   public static void main(String args[])

   {

    for(int i = 0; i 〈 5;i++) new Thread(new MyThread(i+1)).start();

   }

  }
**上海尚學堂Java培訓  shsxt.com

  

  嚴格地說,創建Thread子類的實例也是可行的,但是必須註意的是,該子類必須沒有覆蓋 Thread 類的 run 方法,否則該線程執行的將是子類的 run 方法,而不是我們用以實現Runnable 接口的類的 run 方法,對此大家不妨試驗一下。

  使用 Runnable 接口來實現多線程使得我們能夠在一個類中包容所有的代碼,有利於封裝,它的缺點在於,我們只能使用一套代碼,若想創建多個線程並使各個線程執行不同的代碼,則仍必須額外創建類,如果這樣的話,在大多數情況下也許還不如直接用多個類分別繼承 Thread 來得緊湊。

  綜上所述,兩種方法各有千秋,大家可以靈活運用。

  下面讓我們一起來研究一下多線程使用中的一些問題。

  

二、線程的四種狀態

  1. 新狀態:線程已被創建但尚未執行(start() 尚未被調用)。

  2. 可執行狀態:線程可以執行,雖然不一定正在執行。CPU 時間隨時可能被分配給該線程,從而使得它執行。

  3. 死亡狀態:正常情況下 run() 返回使得線程死亡。調用 stop()destroy() 亦有同樣效果,但是不被推薦,前者會產生異常,後者是強制終止,不會釋放鎖。

  4. 阻塞狀態:線程不會被分配 CPU 時間,無法執行。

  

三、線程的優先級

  線程的優先級代表該線程的重要程度,當有多個線程同時處於可執行狀態並等待獲得 CPU 時間時,線程調度系統根據各個線程的優先級來決定給誰分配 CPU 時間,優先級高的線程有更大的機會獲得 CPU 時間,優先級低的線程也不是沒有機會,只是機會要小一些罷了。

關於Java線程就介紹到這,更多Java學習資料教程請點 上海尚學堂java學習視頻

在java中怎樣實現多線程?線程的4種狀態