執行緒池之newFixedThreadPool定長執行緒池
newFixedThreadPool
建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。newFixedThreadPool固定執行緒池, 使用完畢必須手動關閉執行緒池, 否則會一直在記憶體中存在。示例程式碼:
public class ThreadPoolFixed { public static void main(String[] args) { //設定執行緒池大小為3 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { final int index = i; fixedThreadPool.execute(new Runnable() { @Override public void run() { try { System.out.println(index+"當前執行緒"+Thread.currentThread().getName()); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } fixedThreadPool.shutdown(); } }
執行結果:
因為執行緒池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字。
定長執行緒池的大小最好根據系統資源進行設定。如Runtime.getRuntime().availableProcessors()。
corePoolSize:
執行緒池的基本大小,即在沒有任務需要執行的時候執行緒池的大小,並且只有在工作佇列滿了的情況下才會建立超出這個數量的執行緒。這裡需要注意的是:在剛剛建立ThreadPoolExecutor的時候,執行緒並不會立即啟動,而是要等到有任務提交時才會啟動,除非呼叫了prestartCoreThread/prestartAllCoreThreads事先啟動核心執行緒。再考慮到keepAliveTime
maximumPoolSize:
執行緒池中允許的最大執行緒數,執行緒池中的當前執行緒數目不會超過該值。如果佇列中任務已滿,並且當前執行緒個數小於maximumPoolSize,那麼會建立新的執行緒來執行任務。這裡值得一提的是largestPoolSize,該變數記錄了執行緒池在整個生命週期中曾經出現的最大執行緒個數。為什麼說是曾經呢?因為執行緒池建立之後,可以呼叫setMaximumPoolSize()改變執行的最大執行緒的數目。
poolSize:
執行緒池中當前執行緒的數量,當該值為0的時候,意味著沒有任何執行緒,執行緒池會終止;同一時刻,poolSize不會超過maximumPoolSize。