方法:newCachedThreadPool建立可快取執行緒池、newFixedThreadPool建立定長執行緒池、newScheduledThreadPool建立定長執行緒池、newSingleThreadExecutor建立單一執行緒化執行緒池。
#線程池創建的四種方法
##Java透過Executors提供四個線程池,分別為:1、使用newCachedThreadPool
newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒線程,若無可回收,新建線程。 這種類型的執行緒池特點是:package test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExecutorTest { public static void main(String[] args) { ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int index = i; try { Thread.sleep(index * 1000); } catch (InterruptedException e) { e.printStackTrace(); } cachedThreadPool.execute(new Runnable() { public void run() { System.out.println(index); } }); } } }
2、使用newFixedThreadPool
建立一個指定工作執行緒數量的執行緒池。每當提交一個任務就創建一個工作線程,如果工作線程數量達到線程池初始的最大數,則將提交的任務存入池隊列中。 FixedThreadPool是一個典型且優秀的執行緒池,它具有執行緒池提高程式效率和節省建立執行緒時所耗的開銷的優點。但是,當執行緒池空閒時,也就是當線程池中沒有可執行任務時,它不會釋放工作線程,也會佔用一定的系統資源。 範例程式碼如下:package test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExecutorTest { public static void main(String[] args) { ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int index = i; try { Thread.sleep(index * 1000); } catch (InterruptedException e) { e.printStackTrace(); } cachedThreadPool.execute(new Runnable() { public void run() { System.out.println(index); } }); } } }因為執行緒池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字。 定長線程池的大小最好根據系統資源進行設定如Runtime.getRuntime().availableProcessors()。
3、使用newSingleThreadExecutor
建立一個單執行緒化的Executor,也就是只建立唯一的工作者執行緒來執行任務,它只會用唯一的工作執行緒來執行任務,保證所有任務都依照指定順序(FIFO, LIFO,優先權)執行。如果這個執行緒異常結束,會有另一個取代它,保證順序執行。單工作執行緒最大的特點是可保證順序地執行各個任務,並且在任意給定的時間不會有多個執行緒是活動的。 範例程式碼如下:package test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExecutorTest { public static void main(String[] args) { ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute(new Runnable() { public void run() { try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }); } } }
4、使用newScheduledThreadPool
建立一個定長的執行緒池,而且支援定時的以及週期性的任務執行,支援定時及週期性任務執行。 延遲3秒執行,延遲執行範例程式碼如下:package test; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.schedule(new Runnable() { public void run() { System.out.println("delay 3 seconds"); } }, 3, TimeUnit.SECONDS); } }表示延遲1秒後每3秒執行一次,定期執行範例程式碼如下:
package test; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("delay 1 seconds, and excute every 3 seconds"); } }, 1, 3, TimeUnit.SECONDS); } }更多程式設計相關知識,請造訪:
程式設計學習網站! !
以上是執行緒池創建的四種方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!