本篇文章給大家帶來了關於的相關知識,其中主要總結介紹了建立多執行緒的五種方法,包括了繼承Thread類、實現Runnable介面、實現Callable介面、繼承TimerTask類和通過執行緒池啟動多執行緒,希望對大家有幫助。推薦學習:《》
Java建立多執行緒的五種方法
- 僅作為Java程式設計的交流和學習,如有問題還望不吝賜教。歡迎補充和交流,轉載請註明!
(一)繼承Thread類
1.實現描述
- 通過繼承Thread並且重寫其run( ),run方法中定義需要執行的任務。建立後的子類通過呼叫start( )方法即可執行執行緒方法。
- 通過繼承Thread實現的執行緒類,多個執行緒間無法共用執行緒類的範例變數。需要建立不同Thread物件,自然不共用資源。
2.具體步驟
1)定義UserThread類,繼承Thread類
2)重寫run( )方法
3)建立UserThread物件
4)呼叫start( )方法
3.程式碼實現
4.注意事項
- 資料資源不共用,多個執行緒分別完成自己的任務。比如三個售票視窗同時售票,各自賣各自的票,會出現三個售票視窗出售同一張票的問題。
(二)實現Runnable介面
1.實現描述
- 需要先定義一個類實現Runnable介面並重寫該介面的run( )方法,此run方法是執行緒執行體。接著建立 Runnable實現類的物件,作為建立Thread物件的引數target,此Thread物件才是真正的執行緒物件。
- 利用實現Runnable介面的執行緒類建立物件,可以實現執行緒之間的資源共用。
2.具體步驟
1)定義一個UserRun類,實現Runnble介面
2)重寫run( )方法
3)建立UserRun類的物件
4)建立Thread類的物件,UserRun類的物件作為Thread類構造方法的引數
5)啟動執行緒
3.程式碼實現
4.注意事項
- 資料資源共用,多個執行緒共同完成一個任務(多個執行緒共用了建立執行緒物件的資源)。比如三個售票視窗(三個執行緒)同時售票(MyThread類中的ticket),三個執行緒共同使用資源。
(三)實現Callable介面
1.實現描述
- Callable介面如同Runable介面的升級版,其提供的call( )方法將作為執行緒的執行體,同時允許有返回值。
- Callable物件不能直接作為Thread物件的target,因為Callable介面是 Java5 新增的介面,不是Runnable介面的子介面。
- 對於這個問題的解決方案,就引入 Future介面,此介面可以接受call( )的返回值,RunnableFuture介面是Future介面和Runnable介面的子介面,可以作為Thread物件的target。
2.具體步驟
1)定義類UserCallable,實現Callable介面
2)重寫call( )方法
3)建立UserCallable的物件
4)建立RunnableFuture介面的子類FutureTask的物件,建構函式的引數是UserCallable的物件
5)建立Thread類的物件,建構函式的引數是FutureTask的物件
6)啟動執行緒
3.程式碼實現
4.注意事項
- 資料資源共用,多個執行緒共同完成一個任務(多個執行緒共用了建立執行緒物件的資源)。比如三個售票視窗(三個執行緒)同時售票(MyThread類中的ticket),三個執行緒共同使用資源。同時,執行緒呼叫完畢後還會帶有返回值。
(四)繼承TimerTask類
1.實現描述
- 定時器類Timer和TimerTask可以做為實現執行緒的另一種方式。
- Timer是一種執行緒設施,用於安排以後在後臺執行緒中執行的任務。可安排任務執行一次,或者定期重複執行,可以看成一個定時器,可以排程TimerTask。
- TimerTask是一個抽象類,實現了Runnable介面,所以具備了多執行緒的能力。
2.具體步驟
1)定義類UserTimerTask,繼承抽象類TimerTask
2)建立UserTask類的物件
3)建立Timer類的物件,設定任務的執行策略
3.程式碼實現
4.注意事項
- 定時器類建立執行緒更多的是用於定時任務的處理,並且各執行緒間資料資源不共用,多個執行緒分別完成自己的任務。
(五)通過執行緒池啟動多執行緒
1.實現描述
- 通過Executors 的工具類可以建立執行緒池。
- 提高系統響應速度,當有任務到達時,通過複用已存在的執行緒,無需等待新執行緒的建立便能立即執行。
- 降低系統資源消耗,通過重用已存在的執行緒降低執行緒建立和銷燬造成消耗。
- 方便執行緒並行數的管控。因為執行緒若是無限制的建立,可能會導致記憶體佔用過多而產生OOM,並目會造成CPU過度切換。
2.實現方法
1) FixThreadPool(int n)固定大小的執行緒池
(1)具體步驟
① 通過Executors.newFixedThreadPool(5)建立固定大小的執行緒池
② 重寫Runnable類的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池
(2)程式碼實現
(3)注意事項
- 建立固定大小的執行緒池,可實現資料資源共用,多個執行緒共同完成一個任務。
2)SingleThreadExecutor( )單執行緒池
(1)具體步驟
① 通過Executors.newSingleThreadExecutor( )建立單執行緒池
② 重寫Runnable類的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池
(2)程式碼實現
(3)注意事項
3)CachedThreadPool( )快取執行緒池
(1)具體步驟
① 通過Executors.newCachedThreadPool( )建立儘可能多的執行緒池
② 重寫Runnable類的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池
(2)程式碼實現
(3)注意事項
- 該方法會建立儘可能多的執行緒來完成任務,如案例中雖然只有10張票,但執行緒池卻生成了至少12個執行緒。
4)ScheduledThreadPool(int n)定時週期性執行緒池
(1)具體步驟
① 通過Executors.newScheduledThreadPool(5)建立固定核心執行緒數(最小維護的執行緒數,執行緒建立後不會被回收)的執行緒池,執行緒按計劃定期執行。
② 重寫Runnable類的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池
(2)程式碼實現
(3)注意事項
- 建立一個週期性的執行緒池,支援定時及週期性執行任務(第一個時間引數是執行延遲時間,第二個引數是執行間隔時間)。
5)WorkStealingPool( )新執行緒池類ForkJoinPool的擴充套件
(1)具體步驟
① 通過Executors.newWorkStealingPool( )建立執行緒池
② 重寫Runnable類的run( )方法,通過Thread類的物件呼叫Runnable類的物件,使用執行緒池執行任務
③ Sleep( )讓主執行緒等待子執行緒執行完畢,也可以使用計數器的方式
④ Shutdown( )關閉執行緒池
(2)程式碼實現
(3)注意事項
- 因為每一個執行緒都有一個自己的任務佇列,因為任務有多有少,可能造成CPU負載不均衡。通過本方法可以有效利用多核CPU優勢,少任務的執行緒可以通過「竊取」任務較多的執行緒的任務,從而均衡各CPU任務的執行情況。
推薦學習:《》
以上就是五種方法!Java建立多執行緒總結的詳細內容,更多請關注TW511.COM其它相關文章!