Java基礎筆記之多執行緒
1. 執行緒在程式中是獨立的,併發的執行流。當程序被初始化後,主執行緒就建立了。
2. 多執行緒程式設計的優點:
程序之間不能共享記憶體,但執行緒之間共享記憶體非常容易。
系統建立程序時需要為該程序重新分配系統資源,但建立執行緒則代價小得多,因此使用多執行緒來實現多工併發比多程序的效率高。
Java語言內建了多執行緒功能支援,而不是單純地作為底層作業系統的排程方式,從而簡化了Java的多執行緒程式設計。
3. 執行緒的建立和啟動
Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。每個執行緒的作用是完成一定的任務,實際上就是執行一段程式流。Java使用執行緒執行體來代表這段程式流。
1> 繼承Thread類建立並啟動多執行緒
定義Thread類的子類,並重寫該類的run()方法,該方法的方法體就代表了執行緒需要完成的任務。因此把run()方法體稱為執行緒執行體;
建立Thread子類的例項,即建立了執行緒物件;
呼叫執行緒物件的start()方法來啟動該執行緒。
兩種方法獲取當前執行緒:
<1> Thread.currentThread(): currentThread()是Thread類的靜態方法,該方法總是返回當前正在執行的執行緒物件。
<2> getName(): 該方法是Thread類的例項方法,該方法返回該方法的執行緒名字。
[注*] 使用繼承Thread類的方法來建立執行緒類時,多個執行緒之間無法共享執行緒類的例項變數。
2> 實現Runnable藉口建立和啟動多執行緒
<1> 定義Runnable介面的實現類,並重寫該介面的run()方法,該run()方法的方法體同樣是該執行緒的執行緒執行體。
<2> 建立Runnable實現類的例項,並以此例項作為Thread類的target來建立Thread物件,該Thread物件才是真正的執行緒物件。
<3> 呼叫執行緒物件的start()方法來啟動該執行緒。
[注*] Runnable物件僅僅作為Thread物件的target,Runnable實現類裡包含的run()方法僅作為執行緒執行體。而實際的執行緒物件依然是Thread例項,只是該Thread執行緒負責執行其target的run()方法。
3> 使用Callable和Future建立和啟動多執行緒
<1> 建立Callable介面的實現類,並實現call()方法,該call()方法將作為執行緒執行體,而且該call()方法有返回值。
<2> 建立Callable實現類的例項,使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了該Callable物件的call()方法的返回值。
<3> 使用FutureTask物件作為Thread物件的target建立並啟動該執行緒。
<4> 呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返返回值。
推薦使用實現Runnable介面或Callable介面的方式建立多執行緒。因為實現介面還可以繼承其他類。