1. 程式人生 > 其它 >JavaSE:執行緒的建立

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>,都需要使用匿名內部類來建立和啟動執行緒