透過繼承Thread並且重寫其run( ),run方法中定義需要執行的任務。創建後的子類別透過呼叫start( )方法即可執行線程方法。
透過繼承Thread實作的執行緒類,多個執行緒間無法共享執行緒類別的實例變數。需要建立不同Thread對象,自然不共享資源。
1)定義UserThread類,繼承Thread類別
2)重寫run( )方法
3)建立UserThread物件
4)呼叫start( )方法
資料資源不共享,多個執行緒分別完成自己的任務。例如三個售票窗口同時售票,各自賣各自的票,會出現三個售票窗口出售同一張票的問題。
需要先定義一個類別實作Runnable介面並重寫該介面的run( )方法,此run方法是執行緒執行體。接著創建 Runnable實作類別的對象,作為創建Thread對象的參數target,此Thread對象才是真正的線程對象。
利用實作Runnable介面的執行緒類別建立對象,可以實現執行緒之間的資源共享。
1)定義一個UserRun類,實作Runnble介面
2)重寫run( )方法
3)建立UserRun類別的物件
4)建立Thread類別的對象, UserRun類別的物件以Thread類別建構方法的參數
5)啟動執行緒
資料資源共享,多個執行緒共同完成一個任務(多個執行緒共享了建立執行緒物件的資源)。例如三個售票窗口(三個線程)同時售票(MyThread類別中的ticket),三個線程共同使用資源。
Callable介面如同Runable介面的升級版,其提供的call( )方法將作為執行緒的執行體,同時允許有傳回值。
Callable物件不能直接作為Thread物件的target,因為Callable介面是 Java5 新增的接口,不是Runnable介面的子介面。
對於這個問題的解決方案,就引入Future接口,此接口可以接受call( )的返回值,RunnableFuture接口是Future接口和Runnable接口的子接口,可以作為Thread對象的target。
1)定義類別UserCallable,實作Callable介面
2)重寫call( )方法
3)建立UserCallable的物件
4)建立RunnableFuture介面的子類別FutureTask的對象,建構函式的參數是UserCallable的物件
5)建立Thread類別的對象,建構函式的參數是FutureTask的物件
6)啟動執行緒
資料資源共享,多個執行緒共同完成一個任務(多個執行緒共享了建立執行緒物件的資源)。例如三個售票窗口(三個線程)同時售票(MyThread類別中的ticket),三個線程共同使用資源。同時,線程調用完畢後還會帶有回傳值。
定時器類別Timer和TimerTask可以做為實作執行緒的另一種方式。
Timer是一種執行緒設施,用於安排以後在後台執行緒中執行的任務。可安排任務執行一次,或定期重複執行,可以看成計時器,可以調度TimerTask。
TimerTask是一個抽象類,實作了Runnable接口,所以具備了多執行緒的能力。
1)定義類別UserTimerTask,繼承抽象類別TimerTask
2)建立UserTask類別的物件
3)建立Timer類別的對象,設定任務的執行策略
定時器類別建立執行緒更多的是用於定時任務的處理,並且各執行緒間資料資源不共享,多個執行緒分別完成自己的任務。
透過Executors 的工具類別可以建立執行緒池。
提高系統回應速度,當有任務到達時,透過重複使用已存在的線程,無需等待新執行緒的建立才能立即執行。
降低系統資源消耗,透過重複使用已存在的執行緒降低執行緒建立和銷毀造成消耗。
方便執行緒並發數的管控。因為執行緒若是無限制的創建,可能會導致記憶體佔用過多而產生OOM,並目會造成CPU過度切換。
① 透過Executors.newFixedThreadPool(5)建立固定大小的執行緒池
② 重寫Runnable類別的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池
建立固定大小的執行緒池,可實現資料資源共享,多個執行緒共同完成一個任務。
① 透過Executors.newSingleThreadExecutor( )建立單執行緒池
# ② 重寫Runnable類別的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池
#執行緒池僅建立一個執行緒執行任務。
① 透過Executors.newCachedThreadPool( )建立盡可能多的執行緒池
② 重寫Runnable類別的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池
該方法會建立盡可能多的執行緒來完成任務,如案例中雖然只有10張票,但線程池產生了至少12個線程。
① 透過Executors.newScheduledThreadPool(5)建立固定核心執行緒數(最小維護的執行緒數,執行緒建立後不會被回收)的執行緒池,執行緒依計畫定期執行。
② 重寫Runnable類別的run( )方法,並使用執行緒池執行任務
③ Shutdown( )關閉執行緒池
① 透過Executors.newWorkStealingPool( )建立執行緒池
② 重寫Runnable類別的run( )方法,透過Thread類別的物件呼叫Runnable類別的對象,使用執行緒池執行任務
③ Sleep( )讓主執行緒等待子執行緒執行完畢,也可以使用計數器的方式
④ Shutdown( )關閉執行緒池
以上是Java多執行緒的建立方式有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!