官术网_书友最值得收藏!

3.1 Java線程的創建方式

常見的Java線程的4種創建方式分別為:繼承Thread類、實現Runnable接口、通過ExecutorService和Callable<Class>實現有返回值的線程、基于線程池,如圖3-1所示。

圖3-1

3.1.1 繼承Thread類

Thread類實現了Runnable接口并定義了操作線程的一些方法,我們可以通過繼承Thread類的方式創建一個線程。具體實現為創建一個類并繼承Thread接口,然后實例化線程對象并調用start方法啟動線程。start方法是一個native方法,通過在操作系統上啟動一個新線程,并最終執行run方法來啟動一個線程。run方法內的代碼是線程類的具體實現邏輯。具體的實現代碼如下:

//step 1:通過繼承Thread類創建NewThread線程
public  class  NewThread  extends  Thread  {
    public  void  run()  {
    System.out.println("create  a  thread  by  extends  Thread");
    }
}
//step 2:實例化一個NewThread線程對象
NewThread   newThread  =  new  NewThread();
//step 3:調用start方法啟動NewThread線程
newThread  .start();

以上代碼定義了一個名為NewThread的線程類,該類繼承了Thread, run方法內的代碼為線程的具體執行邏輯,在使用該線程時只需新建一個該線程的對象并調用其start方法即可。

3.1.2 實現Runnable接口

基于Java編程語言的規范,如果子類已經繼承(extends)了一個類,就無法再直接繼承Thread類,此時可以通過實現Runnable接口創建線程。具體的實現過程為:通過實現Runnable接口創建ChildrenClassThread線程,實例化名稱為childrenThread的線程實例,創建Thread類的實例并傳入childrenThread線程實例,調用線程的start方法啟動線程。具體的實現代碼如下:

//step 1:通過實現Runnable接口方式創建ChildrenClassThread線程
public  class  ChildrenClassThread  extends  SuperClass  implements  Runnable  {
    public  void  run()  {
    System.out.println("create  a  thread  by  implements  Runnable  ");
    }
}
//step 2:實例化一個ChildrenClassThread對象
ChildrenClassThread  childrenThread  =  new  ChildrenClassThread();
//step 3:創建一個線程對象并將其傳入已經實例化好的childrenThread實例
Thread  thread  =  new  Thread(childrenThread);
//step 4:調用start方法啟動一個線程
thread.start();

事實上,在傳入一個實現了Runnable的線程實例target給Thread后,Thread的run方法在執行時就會調用target.run方法并執行該線程具體的實現邏輯。在JDK源碼中,run方法的實現代碼如下:

@Override
 public  void  run()  {
      if  (target  ! =  null)  {
          target.run();
      }
  }

3.1.3 通過ExecutorService和Callable<Class>實現有返回值的線程

有時,我們需要在主線程中開啟多個線程并發執行一個任務,然后收集各個線程執行返回的結果并將最終結果匯總起來,這時就要用到Callable接口。具體的實現方法為:創建一個類并實現Callable接口,在call方法中實現具體的運算邏輯并返回計算結果。具體的調用過程為:創建一個線程池、一個用于接收返回結果的Future List及Callable線程實例,使用線程池提交任務并將線程執行之后的結果保存在Future中,在線程執行結束后遍歷Future List中的Future對象,在該對象上調用get方法就可以獲取Callable線程任務返回的數據并匯總結果,實現代碼如下:

//step 1:通過實現Callable接口創建MyCallable線程
public  class  MyCallable  implements  Callable<String>  {
  private  String  name;
  public MyCallable(String name){//通過構造函數為線程傳遞參數,以定義線程的名稱
  this.name  =  name;
}
    @Override
    public String call() throws Exception {//call方法內為線程實現邏輯
      return  name;
    }
}
  //step 2:創建一個固定大小為5的線程池
  ExecutorService  pool  =  Executors.newFixedThreadPool(5);
  //step 3:創建多個有返回值的任務列表list
  List<Future>  list  =  new  ArrayList<Future>();
  for  (int  i  =  0;  i  <  5;  i++)  {
      //step 4:創建一個有返回值的線程實例
      Callable  c  =  new  MyCallable(i  +  "  ");
      //step 5:提交線程,獲取Future對象并將其保存到Future List中
      Future  future  =  pool.submit(c);
      System.out.println("submit  a  callable  thread:"  +i);
      list.add(future);
  }
  //step 6:關閉線程池,等待線程執行結束
  pool.shutdown();
  //step 7:遍歷所有線程的運行結果
  for  (Future  future  :list)  {
    //從Future對象上獲取任務的返回值,并將結果輸出到控制臺
    System.out.println("get  the  result  from  callable  thread:"+
                            f.get().toString())
  }

3.1.4 基于線程池

線程是非常寶貴的計算資源,在每次需要時創建并在運行結束后銷毀是非常浪費資源的。我們可以使用緩存策略并使用線程池來創建線程,具體過程為創建一個線程池并用該線程池提交線程任務,實現代碼如下:

//step 1:創建大小為10的線程池
ExecutorService  threadPool  =  Executors.newFixedThreadPool(10);
 for(int  i  =0  ; i<10; i++){
//step 2:提交多個線程任務并執行
    threadPool.execute(new  Runnable()  {
      @Override
      public  void  run()  {
        System.out.println(Thread.currentThread().getName()  +  "is  running");
              }
          });
      }
}
主站蜘蛛池模板: 成都市| 勐海县| 赤城县| 卢龙县| 阳谷县| 遂川县| 嘉峪关市| 龙江县| 兰考县| 沧源| 甘洛县| 随州市| 岗巴县| 平阴县| 黄平县| 宜丰县| 宜春市| 康乐县| 兴安盟| 增城市| 藁城市| 海晏县| 天水市| 伊宁市| 库尔勒市| 平安县| 甘肃省| 丹凤县| 通化县| 当涂县| 乌鲁木齐县| 万年县| 井研县| 桂平市| 瑞安市| 镇赉县| 沁水县| 丹棱县| 西乡县| 神木县| 白银市|