為什麼要使用執行緒池?
我們使用乙個執行緒的步驟
1.建立執行緒
2.使用執行緒
3.銷毀執行緒
每使用乙個執行緒必須經過這三個步驟,如果步驟1,和步驟3所需要的時間和大於步驟2,我們就得思考,會不會本末倒置,怎麼樣提高效能?
縮短建立和銷毀執行緒的時間!
當乙個執行緒完成自己的工作後,不去銷毀它,讓它繼續執行別的工作,這樣省去了不必要的建立和銷毀執行緒的時間。
執行緒池的主要目的就是方便管理執行緒,並實現執行緒的復用。
執行緒池的結構:
private
final blockingqueueworkqueue;
/*任務佇列,用來存放等待執行的任務*/
private
final reentrantlock mainlock = new reentrantlock();
/*執行緒池的狀態鎖,改變執行緒池的狀態必須使用*/
private
final hashsetworkers = new hashset();
/*存放工作集,可以執行的執行緒都存放在workers裡*/
private
final condition termination = mainlock.newcondition();
private
int largestpoolsize;
/*用來記錄曾經出現過最大的執行緒數*/
private
long completedtaskcount;
/*用來記錄執行完畢的任務數*/
private
volatile threadfactory threadfactory;
/*用來建立執行緒的執行緒工廠*/
private
volatile rejectedexecutionhandler handler;
/*當拒絕任務時
abortpolicy:拋異常。
discardoldestpolicy:丟棄佇列裡最近的乙個任務,並執行當前任務。
discardpolicy:不處理,直接丟棄。
*/private
volatile
long keepalivetime;
/*執行緒數大於核心執行緒數時,執行緒存活的時間*/
private
volatile
boolean allowcorethreadtimeout;
/*是否允許核心執行緒被***/
private
volatile
int corepoolsize;
/*核心執行緒數*/
private
volatile
int maximumpoolsize;
/*最大執行緒數*/
private
static
final rejectedexecutionhandler defaulthandler =new abortpolicy();
/*無指定拒絕任務的策略,預設拋異常*/
以上是執行緒池的主要結構。
執行緒池怎麼運作呢?
這是執行緒池的所有構造方法:
public
threadpoolexecutor(int corepoolsize,
int maximumpoolsize,
long keepalivetime,
timeunit unit,
blockingqueueworkqueue)
public
threadpoolexecutor(int corepoolsize,
int maximumpoolsize,
long keepalivetime,
timeunit unit,
blockingqueueworkqueue,
threadfactory threadfactory)
public
threadpoolexecutor(int corepoolsize,
int maximumpoolsize,
long keepalivetime,
timeunit unit,
blockingqueueworkqueue,
rejectedexecutionhandler handler)
public
threadpoolexecutor(int corepoolsize,
int maximumpoolsize,
long keepalivetime,
timeunit unit,
blockingqueueworkqueue,
threadfactory threadfactory,
rejectedexecutionhandler handler)
建立好執行緒池後
假設5個核心執行緒數,10個最大執行緒數,時間60秒,名為bq的阻塞佇列。
執行緒池開始接受任務,
*如果正在執行的執行緒數量小於 5,那麼馬上建立執行緒執行這個任務;
* 如果正在執行的執行緒數量大於或等於 5,那麼將這個任務放入佇列bq;
* 如果這時候佇列滿了,而且正在執行的執行緒數量小於 10,那麼還是要建立非核心執行緒立刻執行這個任務;
* 如果佇列滿了,而且正在執行的執行緒數量大於或等於 10,那麼執行緒池會丟擲異常rejectexecutionexception。
* 一段時間後,若執行緒池中線程數大於5,並且有空閒執行緒,在60秒後會對空閒的執行緒進行**。
執行緒池怎麼樣實現執行緒復用呢?
化簡後:
private
final
class
worker
implements
runnable
public
void
run()
final
void runworker(worker w)
}
其中gettask()是從阻塞佇列取任務的方法;
通過worker 類中的runworker()方法,實現執行緒的迴圈利用。
若有不正確的地方歡迎指出。
理解執行緒池
建立執行緒池的一種方式 threadpoolexecutor threadpoolexecutor new threadpoolexecutor corepoolsize,maximumpoolsize,keepalivetime,unit,workqueue,threadfactory,handl...
執行緒池學習理解
1.執行緒池是什麼 為了避免系統頻繁地建立和銷毀執行緒,我們可以讓建立的執行緒進行復用。如果大家進行過資料庫開發,對資料庫連線池應該不會陌生。為了避免每次資料庫查詢都重新建立和銷毀資料庫連線,我們可以使用資料庫連線池維護一些資料庫連線,讓他們長期保持在乙個啟用狀態。當系統需要使用資料庫時,並不是建立...
執行緒池的理解
原來一直對執行緒池心存疑惑.第乙個疑惑是.執行緒類在例項化的時候就已經指定了run函式了,也就是說,乙個執行緒在例項化的時候,他能做什麼就已經定下來了,要做別的事,就要新開乙個執行緒.這感覺就和執行緒池的思想違背了,怎麼樣從執行緒池裡面拿乙個執行緒出來就可以執行呢?執行完了然後再放回去呢?第二個疑惑...