您好,登錄后才能下訂單哦!
這篇“Java創建多線程的方法有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java創建多線程的方法有哪些”文章吧。
通過繼承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( )關閉線程池
因為每一個線程都有一個自己的任務隊列,因為任務有多有少,可能造成CPU負載不均衡。通過本方法可以有效利用多核CPU優勢,少任務的線程可以通過“竊取”任務較多的線程的任務,從而均衡各CPU任務的執行情況。
以上就是關于“Java創建多線程的方法有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。