網頁

2017/9/25

Java 如何建立Thread

Java建立Thread的方式有兩種,一是實作Runnable介面,二是繼承Thread類別。


範例一,實作Runnable介面。RunnableARunnableB類別皆繼承了Runnable介面,而Runnable物件可成為建構Thread物件的參數。

Runnable介面只有一個方法run()必須被覆寫,當執行緒開始執行後便會去執行run(),所以每一條執行緒要執行的程式碼就寫在子類別覆寫的run()方法中。

// 範例一
public class RunnableA implements Runnable {

  @Override
  public void run() {
    System.out.println("執行緒a");
  }

}

// 範例一
public class RunnableB implements Runnable {

  @Override
  public void run() {
    System.out.println("執行緒b");
  }

}

測試。將Runnable物件傳入Thread建構子來建立Thread物件ab,然後呼叫Thread.start()方法開始執行執行緒。

// 範例一
public class Test {

  public static void main(String[] args) {
    
    Thread a = new Thread(new RunnableA()); //建立Thread物件a
    Thread b = new Thread(new RunnableB()); //建立Thread物件b
    
    a.start(); // 開始執行緒a
    b.start(); // 開始執行緒b
      
    System.out.println("執行緒main");
    
  }
  
}

執行結果如下。

執行緒a
執行緒main
執行緒b

範例一中共有三個執行緒,分別是執行緒a,執行緒b,及執行緒main,因為Java的main()方法本身就是一條執行緒了。

範例一的三個執行緒的先後順序是由OS安排,執行順序沒有一定。


範例二,繼承Thread類別。要執行的程式也是放在run()方法中。

// 範例二
public class ThreadA extends Thread {
  
  @Override
  public void run(){
    System.out.println("執行緒a");
  }

}

// 範例二
public class ThreadB extends Thread {
  
  @Override
  public void run(){
    System.out.println("執行緒b");
  }

}

測試。因為ThreadAThreadB繼承了Thread類別,所以直接呼叫建構子建立Thread物件ab

// 範例二
public class Test {

  public static void main(String[] args) {
    
    Thread a = new ThreadA();
    Thread b = new ThreadB();
    
    a.start(); // 開始執行緒a
    b.start(); // 開始執行緒b
      
    System.out.println("執行緒main");
    
  }
  
}

執行結果如下

執行緒a
執行緒b
執行緒main

範例二同範例一,共有三個執行緒,分別是執行緒a,執行緒b,及執行緒main。

範例二的三個執行緒的先後順序是由OS安排,執行順序沒有一定。


不過執行緒的建立與執行建議使用Executor的各實作類別,請參考Java 使用ExecutorService來執行多執行緒。


沒有留言:

張貼留言