建立多執行緒的幾種方法
多執行緒有幾種實現方法,分別是什麼?(建立執行緒的幾種方式)
多執行緒有三種實現方法:
1、繼承Thread類,重寫run()方法。然後直接new這個物件的例項,建立一個執行緒的例項,再呼叫start()方法啟動執行緒。(其實本質上Thread是實現了Runnable介面的一個例項,Thread原始檔:public class Thread implements Runnable)
2、實現Runnable介面,重寫run()方法。然後呼叫new Thread(runnable)的方式建立一個執行緒,再呼叫start()方法啟動執行緒。
3、實現Callable介面,重寫call()方法。Callable是類似於Runnable的介面,是屬於Executor框架中的功能類。是JDK1.5中引入的新特性。(不常用,作為了解
- Runnable和Callable的不同點:
- ①Callable規定的方法是call(),而Runnable規定的方法是run().
- ②Callable的任務執行後可返回值,而Runnable的任務是不能返回值的(有返回值用callable方法,無返回值用runnable方法)
- ③call()方法可丟擲異常,而run()方法是不能丟擲異常的。
- ④執行Callable任務可拿到一個Future物件,Future表示非同步計算的結果。它提供了檢查計算是否完成的方法,以等
- 待計算的完成,並檢索計算的結果.通過Future物件可瞭解任務執行情況,可取消任務的執行,還可獲取任務執行的結果
前兩種方法的詳細分析:
(1)繼承Thread類,重寫run()方法:
1、定義一個類繼承Thread類。
2、覆蓋Thread類中的run方法。
3、建立一個執行緒的例項(Thread類的子類物件)。
4、呼叫start方法啟動執行緒執行run方法。
(2)實現Runnable介面,重寫run()方法:
1、定義類實現Runnable介面。
2、重寫介面中的run()方法,將執行緒的任務程式碼封裝到run()方法中。
3、通過Thread類建立執行緒物件,並將Runnable介面的子類物件作為Thread類的建構函式的引數進行傳遞。
為什麼要進行引數傳遞?因為執行緒的任務都封裝在Runnable介面子類物件的run方法中,所以要線上程物件建立時就明確要執行的任務。
4、呼叫執行緒物件的start方法開啟執行緒。
實現Runnable介面的好處,優點:
1、實現Runnable介面的方法中執行緒類只是實現了Runnable介面,還可以繼承其他的類。避免的java單繼承的侷限性。
2、在這種方式下,可以多個執行緒共享一個Runnable物件,利於資源共享。適合多個相同的執行緒去處理同一份資源。
儘量使用實現Runnable介面的方法