JavaSE:執行緒的建立
1. Thread類的概念
<1> java.lang.Thread類代表執行緒,任何執行緒物件,都是Thread類(子類)的例項。
<2> Thread類是執行緒的模板,封裝了複雜的執行緒開啟等操作,封裝了作業系統的差異性
2. 執行緒的建立方式
<1>自定義類,繼承Thread類,並重寫run方法,然後建立該類的物件,呼叫start方法
<2>自定義類,實現Runnable介面,並重寫run方法,建立該類的物件作為實參,來構造Thread型別的物件,
然後使用Thread型別的物件,呼叫start方法
3. 相關的方法
方法宣告 | 功能介紹 |
Thread() | 使用無參的方式,構造物件 |
Thread(String name) | 根據引數指定的名稱,來構造物件 |
Thread(Runnable target) |
根據引數指定的引用來構造物件,其中Runnable是個介面型別 |
Thread(Runnable target,String name) |
根據引數指定引用和名稱,來構造物件 |
void run() |
若使用Runnable引用構造了執行緒物件,呼叫該方法時,最終呼叫介面中的版本 若沒有使用Runnable引用構造執行緒物件,呼叫該方法時,則什麼也不做 |
void start() |
用於啟動執行緒,Java虛擬機器會自動呼叫,該執行緒的run方法 |
4. 程式碼示例 1
1 class ThreadTest{ 2 main(){ 3 4 // 1. 使用無參方式,構造Thread型別的物件 5 // 由原始碼可知:Thread類中的成員變數target的數值,為null 6 Thread t1 = new Thread(); 7 8 // 2. 呼叫run方法進行測試 9 // 由原始碼可知:由於成員變數target的數值為null,10 // 因此 if (target != null) 不成立, 跳過{}中的程式碼不執行 11 // 而run方法中,除了上述程式碼,再無其它程式碼,因此證明,run方法確實"啥也不幹" 12 t1.run(); 13 14 // 3. 列印一句話 15 System.out.println("我想看看你到底是否真的啥也不幹!"); 16 } 17 }
程式碼示例 2
1 class ThreadNoNameTest{ 2 main(){ 3 4 // 匿名內部類的語法格式: 父類/介面型別 引用變數名 = new 父類/介面型別(){方法的重寫}; 5 // 1. 使用 繼承 + 匿名內部類 的方式,建立並啟動執行緒 6 /* 7 Thread t1 = new Thread(){ 8 @Override 9 public void run(){ 10 print("張三說:在嗎?"); 11 } 12 }; 13 t1.start(); 14 */ 15 new Thread(){ 16 @Override 17 public void run(){ 18 print("張三說:在嗎?"); 19 } 20 }.start(); 21 22 23 // 2. 使用 實現介面 + 匿名內部類 的方式建立,並啟動執行緒 24 /* 25 Runnable ra = new Runnable(){ 26 @Override 27 public void run(){ 28 print("李四說:不在"); 29 } 30 }; 31 Thread t2 = new Thread(ra); 32 t2.start(); 33 */ 34 /* 35 new Thread(new Runnable() { 36 @Override 37 public void run(){ 38 print("李四說:不在"); 39 } 40 }).start();zhiqian 41 */ 42 43 // Java8開始,支援lambda表示式: (形參列表) -> {方法體;} 44 /* 45 Runnable ra = () -> print("李四說:不在"); 46 new Thread(ra).start(); 47 */ 48 new Thread( () -> print("李四說:不在") ).start(); 49 } 50 }
5. 執行流程
<1> 執行main方法的執行緒,叫做主執行緒,執行run方法的執行緒,叫做新執行緒/子執行緒
<2> main方法是程式的入口,對於start方法之前的程式碼來說,由主執行緒執行一次。
當start方法呼叫成功後,執行緒個數由1個變成2個,
新啟動的執行緒去執行run方法的程式碼,主執行緒繼續向下執行,兩個執行緒各自獨立執行、互不影響。
<3> 當run方法執行完畢後,子執行緒結束
當main方法執行完畢後,主執行緒結束
<4> 兩個執行緒執行,沒有明確的先後執行次序,由作業系統排程演算法來決定
6. 執行緒建立方式的比較
<1> 繼承Tread類的方式:程式碼簡單,但是,若該類繼承Thread類後,則無法繼承其他類
<2> 實現Runnable介面的方式:程式碼複雜,但不影響該類繼承其他類以及實現其他介面 (推薦)
<3> 不論使用方式<1>還是<2>,都需要使用匿名內部類來建立和啟動執行緒