一、執行緒池的優點
關於執行緒池的使用優點網路上介紹的有很多,可以歸結為以下幾點:
1.減少在建立和銷毀執行緒上所花的時間及系統資源的開銷。
2.提高執行緒的可管理性,對執行緒進行統一的分配、調優和監控,從而也提高相應速度。
二、執行緒池的uml圖和使用方式
執行緒池的uml圖如下,使用執行緒池的方式總共有三種,下面將對這三種方式進行分析和說明。
2.1 第二種方式
由於第一種方式是通過用第二種方式的建構函式建立的,因此在介紹第一種方式前,先對第二種方式進行介紹。
threadpoolexecutor的建構函式及引數說明如下
public threadpoolexecutor(int corepoolsize,
int maximumpoolsize,
long keepalivetime,
timeunit unit,
blockingqueueworkqueue)
corepoolsize:執行緒池中的核心執行緒數,當提交乙個任務時,執行緒池建立乙個新執行緒執行任務,直到當前執行緒數等於corepoolsize;如果當前執行緒數為corepoolsize,繼續提交的任務會被儲存到阻塞佇列中,等待被執行;如果執行了執行緒池的prestartallcorethreads()方法,執行緒池會提前建立並啟動所有核心執行緒。
maximumpoolsize:執行緒池中允許的最大執行緒數。如果當前阻塞佇列滿了,且繼續提交任務,則建立新的執行緒執行任務,前提是當前執行緒數小於maximumpoolsize;
unit:keepalivetime的單位
workqueue:用來儲存等待被執行的任務的阻塞佇列,且任務必須實現runable介面,在jdk中提供了如下佇列模式;
1、arrayblockingqueue 乙個基於陣列結構的阻塞佇列,此佇列按fifo原則對元素進行排序。
2、linkedblockingqueue 乙個基於鍊錶結構的阻塞佇列,此佇列按fifo排序元素,吞吐量通常要高於arrayblockingqueue。今天工廠方法executors.newfixedthreadpool()使用了這個佇列。
3、synchronousqueue乙個不儲存元素的阻塞佇列。每個插入操作必須等到另乙個執行緒呼叫移除操作,否則插入操作一直處於阻塞狀態,吞吐量通常要高於linkedblockingqueue,靜態工廠方法
executors.newcachedthreadpool使用了這個佇列。
4、priorityblockingqueue乙個具有優先順序的無限阻塞佇列。
threadfactory
:執行緒工廠,用於建立執行緒,一般用預設的即可。也可以通過執行緒工廠給每個建立出來的執行緒設定更有意義的名字。
handler
:拒絕策略,當佇列和執行緒池都滿了,說明執行緒池出於飽和狀態,那麼必須採取一種策略處理提交的新任務。這個策略預設情況下是abortpolicy,表示無法處理新任務時丟擲異常。策略模式有其它如下:
2.2 第二種方式的使用
下面的**摘取自okhttp庫中的**,通過對
threadpoolexecutor設定
引數構造乙個執行緒池。
public synchronized executorservice executorservice()
return executorservice;
}2.3 第一種方式
第一種方式是通過工廠模式將執行緒池的建立從使用者的new操作中解耦了,第一種方式建立的執行緒池的型別有如下:
1.初始化乙個指定執行緒數的執行緒池,使用linkedblockingqueue作為阻塞佇列,不過當執行緒池沒有可執行任務時,也不會釋放執行緒。
public static executorservice newfixedthreadpool(int nthreads)
同上初始乙個指定數量的執行緒池,但是會要求傳入乙個自定義的執行緒工廠。
public static executorservice newfixedthreadpool(int nthreads, threadfactory threadfactory)
2.初始化乙個可以快取執行緒的執行緒池,預設快取60是,執行緒池的執行緒數可到達interge.max_value,即2147483647,內部使用synchronousqueue作為阻塞佇列。和newfixedthreadpool建立的執行緒池不同,newcachedthreadpool在沒有任務執行時,當執行緒空閒時間超過keepalivetime,會自動釋放執行緒資源,當提交新任務時,如果沒有空閒執行緒,則建立新執行緒執行任務,會導致一定的系統開銷。
public static executorservice newcachedthreadpool(threadfactory threadfactory)
所以,在使用該執行緒池時,一定要注意控制併發的任務數,否則建立大量的執行緒可能導致嚴重的效能問題。
3.初始化的執行緒池中只有乙個執行緒,如果該執行緒異常結束,會重新建立乙個新的執行緒繼續執行任務,唯一的執行緒可以保證所提交任務的順序執行,內部使用linkedblockingqueue作為阻塞佇列。
public static executorservice newsinglethreadexecutor()
4.初始化的執行緒池可以在指定的時間內週期性的執行所提交的任務,在實際的業務場景中可以使用該執行緒池定期的同步資料。
public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize)
2.4 第三種方式
第三種方式通過定義乙個executorservice的實現,在該實現中完成對executorservice和executor介面的實現。
1.關鍵介面函式execute的實現
public void execute(runnable runnable)
mqueue.add(runnable);
synchronized (mrunningthreads) else
mrunningthreads.add(thread);
thread.start();}}
}2.
workerablethread
類的定義
private final class workerablethread extends thread
workerablethread(string name)
@override
public void run() catch (interruptedexception e)
} if (!taskqueue.isempty())
r = taskqueue.remove(0);// 取出任務
} if (r != null)
finished_task++;
r = null;
} }
// 停止工作,讓該執行緒自然執行完run方法,自然結束
public void stopworker()
private runnable getrunnable()
}附上乙份自定義執行緒池的實現連線參考:
Java執行緒池幾種簡單使用方式
1.提供公共的執行緒池工具類,示例 private static threadpooltaskexecutor taskexecutor null private static integer corepoolsize 10 private static integer maxpoolsize 20...
執行緒池的介紹
構造相關的介紹 阻塞佇列,如果blockingqueue是空的,從blockingqueue取東西的操作將會被阻斷進入等待狀態,直到blockingqueue進了東西才會被喚醒,同樣,如果blockingqueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到blockingqueue...
執行緒池介紹
1.定義 執行緒池是一種多執行緒處理形式,處理過程中將任務新增 到佇列,然後在建立執行緒後自動啟動這些任務。2.作用 執行緒池的作用是限制系統中執行執行緒的數量。根據系統的環境情況,可以手動或是自動設定執行緒數量,達到執行的最佳效果。既不會浪費系統資源,還避免了系統擁擠。用執行緒池控制線程的數量,其...