本篇文章為大家帶來了關於java的相關知識,其中主要總結介紹了創建多線程的五種方法,包括了繼承Thread類別、實作Runnable介面、實作Callable介面、繼承TimerTask類別和透過線程池啟動多線程,希望對大家有幫助。
推薦學習:《java學習教學》
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教學》
以上是五種方法! Java建立多執行緒總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!