如何保證線程按照指定次序執行-newSingleThreadExecutor線程池
在上一篇文章《如何保證線程按照指定次序執行-Thread.join》中,介紹了如何通過Thread.join()函數實現多個線程按照指定次序執行,今天我們來看另一種方式,通過線程池的方式來實現。
首先來看基礎的例子:
public class ThreadPoolTest { public static void main(String[] args) { Thread A = new Thread(() -> System.out.println("A")); Thread B = new Thread(() -> System.out.println("B")); Thread C = new Thread(() -> System.out.println("C")); A.start(); B.start(); C.start(); } }
上述代碼無法保證程序的執行順序,我們引入線程池。使用newSingleThreadExecutor方法。
newSingleThreadExecutor的官方釋義如下:
public static ExecutorService newSingleThreadExecutor()
創建一個使用從無界隊列運行的單個工作線程的執行程序。 (請注意,如果這個單個線程由于在關閉之前的執行過程中發生故障而終止,則如果需要執行后續任務,則新的線程將占用它。)任務保證順序執行,并且不超過一個任務將被激活在任何給定的時間。 與其他等效的newFixedThreadPool(1) 、newFixedThreadPool(1) ,返回的執行器保證不被重新配置以使用額外的線程。
我們來看看實際編程運行的效果。
實現代碼:
public class ThreadPoolTest { public static void main(String[] args) throws InterruptedException { Thread A = new Thread(() -> System.out.println("A")); Thread B = new Thread(() -> System.out.println("B")); Thread C = new Thread(() -> System.out.println("C")); ExecutorService pool = Executors.newSingleThreadExecutor(); pool.submit(A); pool.submit(B); pool.submit(C); pool.shutdown(); } }
運行結果:
根據文檔,我們可以知道,還可以用newFixedThreadPool(1) 或者newFixedThreadPool(1) ,結果是一樣的。
另外,線程池我們最常用的一個函數是execute(Runnable command),在本例測試用,發現使用execute時,也能達到同樣的效果,那么submit與execute有什么區別呢?
execute是接口Executor的方法,其含義為:
void execute(Runnable command)
在將來的某個時間執行給定的命令。 該命令可以在一個新線程,一個合并的線程中或在調用線程中執行,由Executor實現。
而submit是接口ExecutorService的方法,其含義為:
Future> submit(Runnable task)
提交一個可運行的任務執行,并返回一個表示該任務的未來。 未來的get方法將返回null 成功完成時。
通過newSingleThreadExecutor的隊列模式,從而保證了任務按照提交的順序來執行。
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。