1. 程式人生 > >java中執行緒的兩種建立方式與比較

java中執行緒的兩種建立方式與比較

  首先,回顧一下作業系統課程中程序相關部分:

  程序的定義:程序就是程式在一個數據集合上的一次執行過程。他與程式的區別在於程式是靜態的程式碼,而程序是動態的執行過程。

  程序的特性:1.結構性,程序由程式塊、資料塊、程序控制塊(PCB)組成;

          2.動態性,程序是一次動態的執行過程,具有生命週期;

         3.獨立性,程序是系統分配資源和保護的基本單位;

         4. 併發性,一組程序在執行時間上可以重疊,在很短的時間內輪流執行,巨集觀上同時執行。(並行微觀上也是同 時執行)

早期的作業系統中,程序是分配資源和保護的基本單位也是處理器排程的基本單位,後來系統把“獨立資源分配”和“被排程分派執行”功能分開,獨立資源分配的基本單位仍是程序,“被排程分派執行”的基本單位成了執行緒。執行緒就是程序中能夠獨立執行的實體,是處理器排程和分派的基本單位。

下面討論java中建立執行緒的兩種方式和之間的區別:

1. Runna介面

宣告如下:

public interface Runnable
{
     public abstract void run();
}

這個介面只有一個run()方法,也就是執行緒的執行方法,一個執行緒物件必須實現run()方法描述該執行緒所有的操作。

2.Thread類

Thread類就是執行緒類,他的部分方法宣告如下:

public class Thread extends Object implements Runnable
{
   public Thread();
   public Thread(String name);
   public Thread(Runnable target );            
   public Thread(String name,Runnable target);

  public void run();
  public void start();
  public String toString()
}

從Thread類的構造方法可以看出,java建立執行緒的兩種方法是:繼承Thread類,實現Runnable介面。

第一種建立方法:

public class A extends Thread
{
   public void run()
  {
    System.out.print(0);
  }
  public static void main(String []args)
  {
    A a=new A("執行緒1");
    a.start(); }
}

執行後輸出0。

A類繼承了Thread類,建立物件a後,a呼叫Thread類的start()函式就開始執行run()方法。

第二種建立方法:


public class A implements Runnable
{
   public void run()
  {
     System.out.print(1);
   }
   public static void main(String []args)
{
   A a=new A();
   Thread t=new Thread(a);
   t.start();
}

}

執行後輸出1。

A類實現了Runnable介面,也就是實現了run()函式,將A類物件a作為目標物件,建立一個執行緒物件t,呼叫t.start(),將執行a的run()方法。

兩種方法的比較:

兩種方式建立執行緒物件的效果是一樣的,不同場合如何選取呢?

繼承Threa類,並且覆蓋Thread類的run()方法:這種方法的優點是Thread子類物件就是執行緒物件,具有Thread類的方法,且具有執行緒體,但是不適應多繼承。因為java裡類的繼承是單繼承的,繼承了Thread類就無法繼承其他類了。

實現Runnable介面:如果一個類已經繼承了一個類還必須要以執行緒方式執行,就需要實現Runnable介面。實現Runnable介面的類的物件本身並不是執行緒物件,只是作為一個建立執行緒物件的目標物件使用。