java兩種啟動執行緒方法根本不同,Thread繼承和實現Runable介面
java實現多執行緒有兩種方法
1、繼承Thread類,實現run方法
2、實現Runable介面,實現run方法
示例程式截圖(程式來自瘋狂java講義)
實現步驟
(1)定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體就代表了執行緒需要完成的任務。因此run()方法稱為執行緒執行體。
(2)建立Thread子類的例項,即建立了執行緒物件。
(3)呼叫執行緒物件的start()方法來啟動該執行緒。
雖然程式只顯示的建立並啟動了2個執行緒,但實際上程式有3個執行緒,即程式顯示建立的2個子執行緒和主執行緒。當java程式開始執行後,程式至少會建立一個主執行緒,主執行緒的執行緒執行體不是由run()方法確定的,而是由main()方法確定的。main()方法的體代表主執行緒的執行緒執行體。
預設情況下,主執行緒的名字為main,使用者啟動的多個執行緒的名字依次為Thread-0,Thread-1,Thread-2.。。。。。。
從執行結果可以看出,Thread0與Thread1兩個執行緒輸出的i變數不是連續的。注意,i變數時FirstThread的例項屬性,而不是區域性變數,但因為程式每次建立執行緒物件時都需要建立一個FirstThread物件,所以兩個執行緒不能共享該例項的屬性。
即,使用繼承Thread類的方法來建立執行緒類時,多個執行緒之間無法共享執行緒類的例項變數。
步驟:
(1)定義Runable介面的實現類,並重寫該類的介面run()方法,該run()方法的方法體同樣是該執行緒的執行緒執行體。
(2)建立Runable實現類的例項,並以此作為Thread的target來建立Thread物件,該Thread物件才是真正的執行緒物件。
Runable物件僅僅作為Thread物件的target,Runable實現裡面包含的run()方法僅作為執行緒執行體。而實際的執行緒物件依然是Thread例項,只是該Thread執行緒負責執行其target的run()方法。
從執行結果可以看出,採用Runable介面的方式建立的多個執行緒可以共享執行緒類例項屬性。因為這種方式下,程式所建立的Runable物件只是執行緒的target,而多個執行緒可以共享同一個target,所以多個執行緒可以共享同一個執行緒類(實際應該是執行緒的target類)的例項屬性。