在開發中我們會使用到線程,而為了減少資源的損耗,提高性能,我們一般會使用線程池。線程池具有重用存在的線程,減少對象創建、消亡的開銷,性能佳, 可有效控制最大並發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞,提供定時執行、定期執行、單線程、並發數控制等功能。那么線程池是怎么執行的呢,我們來分析一下:
要了解線程池的執行過程,我們需要知道線程池是怎么創建的,現在我們來說其中一種:
<ignore_js_op>
從上面的構造方法中可以看出,線程池的創建是定義了相關的概念的,那么線程池是如何提交任務的呢,當線程池創建完畢之后,要提交任務,需要調用它里面的excute方法進行提交:
[Java]
純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public
void
execute(Runnable command) {
if
(command ==
null
)
throw
new
NullPointerException();
int
c = ctl.get();
//當前線程池中線程比核心線程數少,新建線程執行任務
if
(workerCountOf(c) < corePoolSize) {
if
(addWorker(command,
true
))
return
;
c = ctl.get();
}
//當前線程池中核心線程池已滿,但是任務隊列未滿,則添加到隊列中
if
(isRunning(c) && workQueue.offer(command)) {
int
recheck = ctl.get();
//如果被關閉則拒絕任務
if
(! isRunning(recheck) && remove(command))
reject(command);
//如果之前的線程已被銷毀則新建一個線程
else
if
(workerCountOf(recheck) ==
0
)
addWorker(
null
,
false
);
}
//當前線程池中核心線程池已滿,隊列已滿,試着創建一個新線程
else
if
(!addWorker(command,
false
))
//創建線程失敗,說明線程池關閉或者完全滿了,拒絕任務
reject(command);
}
|
可以看到,線程池處理一個任務主要分三步處理,代碼注釋里已經介紹了。現在我們使用圖片來理解一下:
<ignore_js_op>
從圖中我們可以看到,向線程池提交任務時,會首先判斷線程池中的線程數是否大於設置的核心線程數,如果不大於,就創建一個核心線程來執行任務。
如果大於核心線程數,就會判斷緩沖隊列是否滿了,如果沒有滿,則放入隊列,等待線程空閑時執行任務。
如果隊列已經滿了,則判斷是否達到了線程池設置的最大線程數,如果沒有達到,就創建新線程來執行任務。
如果已經達到了最大線程數,則執行指定的拒絕策略。
更多java學習資料可關注:itheimaGZ獲取