1. 程式人生 > 程式設計 >Java 建立執行緒的3種方法及各自的優點

Java 建立執行緒的3種方法及各自的優點

1. 繼承 Thread 類,然後呼叫 start 方法。

 class MyThread extends Thread {
   //重寫run方法,執行緒執行後,跑的就是run方法 
   public void run(){
     //System.out.println("");
   }
  
   public static void main(String[] args){
     Thread t1 = new MyThread();
        t1.start(); //執行緒執行,呼叫的 run()方法.
   }
 }

2. 實現 Runnable 介面的 run 方法,然後再用 Thread 類包裹後,呼叫 start 方法。

 class TestThread implements Runnable{
  
   @Override
   public void run() {
     // implement run method here 
     //System.out.println("");
   }
  
   public static void main() {
     final TestThread obj = new TestThread();
     Thread t1 = new Thread(obj);
     t1.start();
   }
 
 }

3. 實現 Callable 介面的 call 方法,用 FutureTask 類包裹 Callable 物件。然後再用 Thread 類包裹 FutureTask 類,並呼叫 start 方法。call() 方法可以有返回值。

class MyCallable implements Callable {
  @Override
  public Integer call() throws Exception {
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
      sum += i;
    }
    return sum;
  }

  public static void main(String[] args) throws Exception {
    MyCallable mc = new MyCallable(); //例項化 callable

    FutureTask oneTask = new FutureTask(mc); //用FutureTask包裹
    Thread oneThread = new Thread(oneTask); //用Thread包裹
    oneThread.start();
    System.out.print(oneTask.get()); //獲取返回值
  }
}

Callable 方法在 Java 8 後,支援拉姆達表示式的寫法,可以建立一個 FutureTask 類,語句上不是太羅嗦。 Callable 方式有以下幾個優點:

  • 可以捕獲執行緒上的異常。
  • 可以通過 get 方法得到返回值。
  • get 方法阻塞當前執行緒,直到呼叫的執行緒執行結束。
  • 可以取消執行緒的執行。

下面程式碼演示了使用 FutureTask 類執行執行緒,捕獲異常的例子:

FutureTask<Integer> task=new FutureTask<Integer>(()->{
  throw new Exception("自定義異常");
});
 
new Thread(task).start();
 
try {
  System.out.println(task.get());
} catch (Exception e) {
  System.out.println(e.getMessage());
}

Java 6 之後,還可以通過建立執行緒池來建立執行緒,使用 ExecutorService 的 execute 方法:

 ExecutorService es = Executors.newCachedThreadPool();
 Runnable r = <your runnable here>;
 es.execute(r);

實現Runnable介面相對於繼承Thread類的優勢:

(1) 適合多個相同程式程式碼的執行緒去處理同一資源的情況

(2) 可以避免由於java單一繼承帶來的侷限性

(3) 用介面的方式將你的程式碼和執行緒實現分離,更加清晰。

(4) 通過繼承Thread類,每個執行緒都有一個相關聯的唯一物件,而實現Runnable介面,多執行緒可以共享同一個Runnable例項。

(5) 增強了程式的健壯性,程式碼能夠被多個執行緒共享,程式碼與資料是獨立的。

以上就是Java 建立執行緒的3種方法及各自的優點的詳細內容,更多關於JAVA 建立執行緒的資料請關注我們其它相關文章!