首頁  >  文章  >  Java  >  Java多執行緒的建立方式有哪些?

Java多執行緒的建立方式有哪些?

PHPz
PHPz轉載
2023-04-26 16:07:192200瀏覽

Java多執行緒的建立方式有哪些?


Java創建多執行緒的五種方法

(一)繼承Thread類別

#1.實作描述

  • 透過繼承Thread並且重寫其run( ),run方法中定義需要執行的任務。創建後的子類別透過呼叫start( )方法即可執行線程方法。

  • 透過繼承Thread實作的執行緒類,多個執行緒間無法共享執行緒類別的實例變數。需要建立不同Thread對象,自然不共享資源。

2.具體步驟

1)定義UserThread類,繼承Thread類別
2)重寫run( )方法
3)建立UserThread物件
4)呼叫start( )方法

3.程式碼實作

Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?

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.程式碼實作

Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?

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.程式碼實作

Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?

4.注意事項

  • 資料資源共享,多個執行緒共同完成一個任務(多個執行緒共享了建立執行緒物件的資源)。例如三個售票窗口(三個線程)同時售票(MyThread類別中的ticket),三個線程共同使用資源。同時,線程調用完畢後還會帶有回傳值

(四)繼承TimerTask類別

1.實作描述

  • 定時器類別Timer和TimerTask可以做為實作執行緒的另一種方式。

  • Timer是一種執行緒設施,用於安排以後在後台執行緒中執行的任務。可安排任務執行一次,或定期重複執行,可以看成計時器,可以調度TimerTask。

  • TimerTask是一個抽象類,實作了Runnable接口,所以具備了多執行緒的能力。

2.具體步驟

1)定義類別UserTimerTask,繼承抽象類別TimerTask
2)建立UserTask類別的物件
3)建立Timer類別的對象,設定任務的執行策略

3.程式碼實作

Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?

Java多執行緒的建立方式有哪些?

4.注意事項

  • 定時器類別建立執行緒更多的是用於定時任務的處理,並且各執行緒間資料資源不共享,多個執行緒分別完成自己的任務。

(五)透過執行緒池啟動多執行緒

1.實作描述

  • 透過Executors 的工具類別可以建立執行緒池。

  • 提高系統回應速度,當有任務到達時,透過重複使用已存在的線程,無需等待新執行緒的建立才能立即執行。

  • 降低系統資源消耗,透過重複使用已存在的執行緒降低執行緒建立和銷毀造成消耗。

  • 方便執行緒並發數的管控。因為執行緒若是無限制的創建,可能會導致記憶體佔用過多而產生OOM,並目會造成CPU過度切換。

2.實作方法

1) FixThreadPool(int n)固定大小的執行緒池
#(1) 具體步驟

① 透過Executors.newFixedThreadPool(5)建立固定大小的執行緒池
② 重寫Runnable類別的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池

(2)程式碼實作

Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?

#(3)注意事項
  • 建立固定大小的執行緒池,可實現資料資源共享,多個執行緒共同完成一個任務。

2)SingleThreadExecutor( )單執行緒池
(1)具體步驟

① 透過Executors.newSingleThreadExecutor( )建立單執行緒池
# ② 重寫Runnable類別的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池

(2)程式碼實作

Java多執行緒的建立方式有哪些?

(3)注意事項
  • #執行緒池僅建立一個執行緒執行任務。

3)CachedThreadPool( )快取執行緒池
(1)具體步驟

① 透過Executors.newCachedThreadPool( )建立盡可能多的執行緒池
② 重寫Runnable類別的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池

(2)程式碼實作

Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?

#(3)注意事項
  • 該方法會建立盡可能多的執行緒來完成任務,如案例中雖然只有10張票,但線程池產生了至少12個線程。

4)ScheduledThreadPool(int n)定時週期性執行緒池
(1)具體步驟

① 透過Executors.newScheduledThreadPool(5)建立固定核心執行緒數(最小維護的執行緒數,執行緒建立後不會被回收)的執行緒池,執行緒依計畫定期執行。
② 重寫Runnable類別的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池

(2)程式碼實作

Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?

  • ###################################################################################### ############(3)注意事項############建立一個週期性的執行緒池,支援定時及週期性執行任務(第一個時間參數是執行延遲時間,第二個參數是執行間隔時間)。 ###
5)WorkStealingPool( )新執行緒池類別ForkJoinPool的擴充功能
(1)具體步驟

① 透過Executors.newWorkStealingPool( )建立執行緒池
② 重寫Runnable類別的run( )方法,透過Thread類別的物件呼叫Runnable類別的對象,使用執行緒池執行任務
③ Sleep( )讓主執行緒等待子執行緒執行完畢,也可以使用計數器的方式
④ Shutdown( )關閉執行緒池

(2)程式碼實作

Java多執行緒的建立方式有哪些?
Java多執行緒的建立方式有哪些?

##(3)注意事項
  • 因為每個執行緒都有一個自己的任務佇列,因為任務有多有少,可能造成CPU負載不平衡。透過本方法可以有效利用多核心CPU優勢,少任務的執行緒可以透過「竊取」任務較多的執行緒的任務,從而均衡各CPU任務的執行情況。

  • #

以上是Java多執行緒的建立方式有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除