1. 程式人生 > >java兩種啟動執行緒方法根本不同,Thread繼承和實現Runable介面

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類)的例項屬性。