1. 程式人生 > >Java多執行緒系列-執行緒池的優點和方法

Java多執行緒系列-執行緒池的優點和方法

new Thread的弊端如下:

a. 每次new Thread新建物件效能差。
b. 執行緒缺乏統一管理,可能無限制新建執行緒,相互之間競爭,及可能佔用過多系統資源導致宕機或oom。
c. 缺乏更多功能,如定時執行、定期執行、執行緒中斷。


相比new Thread,Java提供的四種執行緒池的好處在於:
a. 重用存在的執行緒,減少物件建立、消亡的開銷,效能佳。
b. 可有效控制最大併發執行緒數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。
c. 提供定時執行、定期執行、單執行緒、併發數控制等功能。

方式一:

Java通過Executors提供四種執行緒池,分別為:
newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。


newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。
newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。
newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。

方式二:

ThreadPoolExecutor執行緒池,這是JDK5.0後自帶的執行緒池,這裡的引數依次代表:
//1 核心執行緒數(最小活動執行緒數)
//2 最大執行緒數及併發數【這個要注意,如果你的實際發大於該數,則有些請求這個時候雖然被接收,但是去得不到處理,這個資料一定得根據實際情況而設定,如我這裡設值為20,實際模擬併發50,如迴圈一次,或者是二次併發,總會有20個不能夠處理,如果設為25,就有15得不到處理,如果設為50則全部可以被處理,這個可以折磨了我好幾天】
//3 執行緒池維護執行緒所允許的空閒時間
//4 執行緒池維護執行緒所允許的空閒時間的單位
//5 執行緒池所使用的緩衝佇列
//6 執行緒池對拒絕任務的處理策略(通常是丟擲異常)

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 100, 10,TimeUnit.SECONDS, 
new ArrayBlockingQueue<Runnable>(10),
new ThreadPoolExecutor.DiscardOldestPolicy());
while(true){
//偵聽
server.clientSocket=server.serverSocket.accept();
if(server.clientSocket!=null)
{ 
//採用執行緒池啟動執行緒
threadPool.execute(new MsgListener(server.clientSocket));
}
}