Java-Thread01之創建執行緒

  • 2019 年 10 月 12 日
  • 筆記

—— ![](https://img2018.cnblogs.com/blog/1822322/201910/1822322-20191012203044528-233907422.jpg) —— ## 我 **QQ:1755497577(備註:部落格)** **B站:code_ant(java相關培訓影片)** ![微信搜索公眾號:CodeAnt](https://img2018.cnblogs.com/blog/1822322/201910/1822322-20191012203046241-24207210.png) —— ## 簡述 – 執行緒創建 demo:https://github.com/LiJinHongPassion/ThreadTest 四種創建方式分類 — **有返回值** – 實現callable介面 – **無返回值** – 繼承 Thread 類 – 實現 Runnable 介面 — **thread類api** – 繼承 Thread 類 – 實現 Runnable 介面 **執行緒池** – 實現callable介面 – — **Thread 類** 在上一天內容中我們已經可以完成最基本的執行緒開啟,那麼在我們完成操作過程中用到了 java.lang.Thread 類,API中該類中定義了有關執行緒的一些方法,具體如下: 構造方法: – public Thread() :分配一個新的執行緒對象。 – public Thread(String name) :分配一個指定名字的新的執行緒對象。 – public Thread(Runnable target) :分配一個帶有指定目標新的執行緒對象。 – public Thread(Runnable target,String name) :分配一個帶有指定目標新的執行緒對象並指定名字。 常用方法: – public String getName() :獲取當前執行緒名稱。 – public void start() :導致此執行緒開始執行; Java虛擬機調用此執行緒的run方法。 – public void run() :此執行緒要執行的任務在此處定義程式碼。 – public static void sleep(long millis) :使當前正在執行的執行緒以指定的毫秒數暫停(暫時停止執行)。 – public static Thread currentThread() :返回對當前正在執行的執行緒對象的引用。 翻閱API後得知創建執行緒的方式總共有兩種,一種是繼承Thread類方式,一種是實現Runnable介面方式,方式一我們上一天已經完成,接下來講解方式二實現的方式。 ## 繼承 Thread 類 Thread 類本質上是實現了 Runnable 介面的一個實例,代表一個執行緒的實例。啟動執行緒的唯一方法就是通過 Thread 類的 start()實例方法。start()方法是一個 native 方法,它將啟動一個新執行緒,並執行 run()方法。 “`java public class MyThread extends Thread { public void run() { System.out.println(“MyThread.run()”); } } //啟動 MyThread myThread1 = new MyThread(); myThread1.start(); “` ## 實現 Runnable 介面 如果自己的類已經 extends 另一個類,就無法直接 extends Thread,此時,可以實現一個Runnable 介面。 “`java public class MyThread extends OtherClass implements Runnable { public void run() { System.out.println(“MyThread.run()”); } } //啟動 MyThread,需要首先實例化一個 Thread,並傳入自己的 MyThread 實例: MyThread myThread = new MyThread(); Thread thread = new Thread(myThread); thread.start(); //事實上,當傳入一個 Runnable target 參數給 Thread 後,Thread 的 run()方法就會調用target.run() public void run() { if (target != null) { target.run(); } } “` ## ExecutorService 、Callable 、Future 有返回值 執行緒 有返回值的任務必須實現 Callable 介面,類似的,無返回值的任務必須 Runnable 介面。執行Callable 任務後,可以獲取一個 Future 的對象,在該對象上調用 get 就可以獲取到 Callable 任務返回的 Object 了,再結合執行緒池介面 ExecutorService 就可以實現傳說中有返回結果的多執行緒了。 ## Thread 和Runnable的區別 如果一個類繼承Thread,則不適合資源共享。但是如果實現了Runable介面的話,則很容易的實現資源共享。 總結: 實現Runnable介面比繼承Thread類所具有的優勢: 1. 適合多個相同的程式程式碼的執行緒去共享同一個資源。 2. 可以避免java中的單繼承的局限性。 3. 增加程式的健壯性,實現解耦操作,程式碼可以被多個執行緒共享,程式碼和執行緒獨立。 4. 執行緒池只能放入實現**Runable或Callable類**執行緒,不能直接放入繼承Thread的類。

擴充:在java中,每次程式運行至少啟動2個執行緒。一個是main執行緒,一個是垃圾收集執行緒。因為每當使用java命令執行一個類的時候,實際上都會啟動一個JVM,每一個JVM其實在就是在作業系統中啟動了一個進程。

## 匿名內部類方式實現執行緒的創建 使用執行緒的內匿名內部類方式,可以方便的實現每個執行緒執行不同的執行緒任務操作。 使用匿名內部類的方式實現Runnable介面,重新Runnable介面中的run方法: “`java public class NoNameInnerClassThread { public static void main(String[] args) { // new Runnable(){ // public void run(){ // for (int i = 0; i < 20; i++) { // System.out.println("張宇:"+i); // } // } // }; //‐‐‐這個整體 相當於new MyRunnable() Runnable r = new Runnable(){ public void run(){ for (int i = 0; i < 20; i++) { System.out.println("張宇:"+i); } } }; new Thread(r).start(); ``` > 本文由部落格一文多發平台 [OpenWrite](https://openwrite.cn) 發布!