多線程實現的三種方式及其優缺點


多線程有多種實現方式,常見的有以下三種:

1、繼承Thread類,重寫run()方法。

1) 定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體就代表了線程要完成的任務。因此把run()方法稱為執行體。

2)創建Thread子類的實例即創建了線程對象。

3)調用線程對象的start()方法啟動線程。

2、實現Runnable接口,重寫run()方法。

1)定義Runnable接口的實現類,並重寫該方法的run()方法,該run()方法同樣是該線程的執行體。

2)創建Runnable實現類的實例,並依此實例作為Thread的target來創建Thread對象,該Thread對象才是真正的線程對象。

3)調用線程對象的start()方法啟動線程。

3、通過實現Callable接口和使用FutureTask包裝器來實現線程。

1)創建Callable接口的實現類,並實現call()方法,該call()方法的方法體同樣是該線程的執行體。

2)創建Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。

3)使用FutureTask對象作為Thread對象的target創建並啟動新線程。

4)調用FutureTask對象的get()方法來獲得子線程執行結束后的返回值。

三種實現方式的優缺點對比:

1、實現Runnable和Callable接口方式:

優點:

1)線程類只是實現了Runnable接口(JDK1.0開始)或Callable接口(JDK1.5開始),還可以繼承其他類。

2)多線程可以共享同一個target對象,非常適合多個相同線程來處理同一份資源的情況,從而可以將CPU、代碼和數據分開,形成清晰的模型,較好地體現了面向對象的思想。

3)實現Callable接口創建多線程最大的好處是可以有返回值。

缺點:

編程稍顯復雜,如果要訪問當前線程,則必須使用Thread.currentThread()方法。

2、使用繼承Thread類方式:

優點:

編寫簡單,如果要訪問當前線程無需使用Thread.currentThread()方法,直接使用this即可獲得當前線程。

缺點:

線程類已經繼承了Thread類,不能再繼承其他類(java的單繼承性),因此該方式不夠靈活。

補充說明:

1)Callable規定重寫call()方法;Runnable重寫run()方法。

2)Callable的任務執行結束后可有返回值;Runnable的任務是不能有返回值的。

3)call()方法可以拋出異常;run()方法不可以。

4)運行Callable任務可以拿到一個Future對象,表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢查計算的結果。通過Future對象可以了解任務執行情況,可取消任務的執行,可以獲取執行結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM