線程池的執行任務的過程


在開發中我們會使用到線程,而為了減少資源的損耗,提高性能,我們一般會使用線程池。線程池具有重用存在的線程,減少對象創建、消亡的開銷,性能佳, 可有效控制最大並發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞,提供定時執行、定期執行、單線程、並發數控制等功能。那么線程池是怎么執行的呢,我們來分析一下:

要了解線程池的執行過程,我們需要知道線程池是怎么創建的,現在我們來說其中一種:

<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獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM