Java 線程建立的 3 種方式

  1. 經過繼承 Thread 類
//匿名 Thread 類
new Thread(){
    //重寫 run 方法
     @Override
    public void run() {
       super.run();
    }
}.start();
class MyThread extends Thread {
    @Override
    public void run() {
       super.run();
    }
}
//假設把 run 方法當作一個任務,那麼每建立一個線程,就有一個新的任務
 MyThread myThread = new MyThread();
 myThread.start();
  • Thread 也實現了 Runnable 接口java

  • 多個線程相互獨立,由於建立了多個任務,沒法實現資源共享(資源寫在 MyThread 類裏)ide

  • Java 單繼承的特性致使不夠靈活線程

  1. 經過實現 Runnable 接口,傳入 Thread 啓動
//須要藉助 Thread 類
new Thread(new Runnable() {
   //重寫 run 方法  
     @Override
     public void run() {

     }
}).start();
class MyRunnable implements Runnable {
          @Override
         public void run() {

         }
}
//其實仍是經過 Thread 類對象來建立線程的,每建立一個線程,傳入的是同一個任務
new Thread(new MyRunnable()).start();
  • 多個線程協調做業,完成同一個任務,實現了資源共享(資源寫在 MyRunnable 類裏)code

  • 能夠避免因爲 java 單繼承特徵帶來的侷限性對象

  1. 經過實現 Callable 接口,藉助 FutureTask 類,傳入 Thread 啓動
//一樣須要藉助 Thread 類
 new Thread(new FutureTask<String>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return null;
            }
})).start();
class MyCallable implements Callable<String>{
     @Override
     public String call() throws Exception {
                return null;
     }
}
MyCallable myCallable = new MyCallable();
//FutureTask 實現了 RunnableFuture<V> 接口,而 RunnableFuture 繼承了 Runnable 和 Future<V>
FutureTask<String> futureTask = new FutureTask<>(myCallable);
//Runnable 的特性
new Thread(futureTask).start();
//獲取返回值, Future<V> 的特性
String result=futureTask.get();
  • 相似於 Runnable 接口繼承

  • 有返回值接口

  • 能夠拋出異常資源

總結:三種方式最終仍是經過 Thread 類對象來真正建立線程的get

相關文章
相關標籤/搜索