java多執行緒|創建執行緒的各種方式

  • 2019 年 11 月 7 日
  • 筆記

javaDEMO

本網站記錄了最全的各種JavaDEMO ,保證下載,複製就是可用的,包括基礎的, 集合的, spring的, Mybatis的等等各種,助力你從菜鳥到大牛,記得收藏哦~~ https://www.javastudy.cloud

創建執行緒

繼承Thread類

/**   * @Author https://www.javastudy.cloud   * @CreateTime 2019/11/01   **/  public class ThreadStudy extends Thread{        /**       * 繼承Thread類並且重寫run方法,       * 這個方法並不常用,因為一個java類只能繼承一個類       */      @Override      public void run() {          System.out.println("run in sub Thread , Thread name is "+ Thread.currentThread().getName());      }        public static void main(String[] args) {          System.out.println("run in main Thead , Thread name is "+ Thread.currentThread().getName());            ThreadStudy study = new ThreadStudy();          //注意啟動執行緒要用 start()方法          study.start();          try {              //讓主執行緒休眠兩秒,讓子執行緒有足夠的時間運行              Thread.sleep(2000);          } catch (InterruptedException e) {              e.printStackTrace();          }        }  }

運行結果:

實現Runnable介面

這種讓一個類直接實現Runnable介面顯得有些笨重 實際開發中,經常會用下面匿名類的方式創建執行緒

/**   * @Author https://www.javastudy.cloud   * @CreateTime 2019/11/01   **/  public class ThreadStudy implements Runnable{        /**       * 實現Runnable介面,       * 這個是常用的方法,因為一個java類可以實現多個介面       */      @Override      public void run() {          System.out.println("run in sub Thread , Thread name is "+ Thread.currentThread().getName());      }        public static void main(String[] args) {          System.out.println("run in main Thead , Thread name is "+ Thread.currentThread().getName());            //要先new 一個Thread          // 然後把實現Runnable介面的類傳入到Thread的構造函數中          ThreadStudy study = new ThreadStudy();          Thread thread = new Thread(study);            //注意啟動執行緒要用 start()方法          thread.start();          try {              //讓主執行緒休眠兩秒,讓子執行緒有足夠的時間運行              Thread.sleep(2000);          } catch (InterruptedException e) {              e.printStackTrace();          }        }  }

使用匿名類來創建執行緒,這裡使用了lambda的寫法,也是實際開發中常用的寫法

/**   * @Author https://www.javastudy.cloud   * @CreateTime 2019/11/01   **/  public class ThreadStudy {          public static void main(String[] args) {          System.out.println("run in main Thread , Thread name is "+ Thread.currentThread().getName());            // 不用類實現Runnable介面了, 直接這樣定義,方便,省事          Runnable runnable = ()-> System.out.println("run in sub Thread, Thread name is "+Thread.currentThread().getName());          // 啟動這個執行緒還是要用Thread來包裝下,然後調用Thread.start()方法          Thread thread = new Thread(runnable);          thread.start();          try {              //讓主執行緒休眠兩秒,讓子執行緒有足夠的時間運行              Thread.sleep(2000);          } catch (InterruptedException e) {              e.printStackTrace();          }        }  }

使用執行緒池

/**   * @Author https://www.javastudy.cloud   * @CreateTime 2019/11/01   **/  public class ThreadStudy {          public static void main(String[] args) {          System.out.println("Run in main Thread, Thread name is "+ Thread.currentThread().getName());            //一句話就可以創建一個執行緒池下面這種寫法執行緒沒有上限,實際開發中不太推薦          // 開發中一般是用下行注釋的方法,或者自定義執行緒池參數          // 常用的還有 Executors.newFixedThreadPool(10);去創建固定10個執行緒的池子,這個也有弊端,就是等待的隊列沒有上界          //          ExecutorService service = Executors.newCachedThreadPool();          // 沒有返回值的處理          service.submit(()-> System.out.println("Run in sub Thread, Thread name is "+Thread.currentThread().getName()));          // 有返回值的處理,用一個Future 去接收          Future<String> submit = service.submit(() -> "Run in sub Thread with return , Thread name is " + Thread.currentThread().getName());            //輸出future裡面的值          try {              System.out.println(submit.get());          } catch (InterruptedException e) {              e.printStackTrace();          } catch (ExecutionException e) {              e.printStackTrace();          }        }  }

運行結果: