在java併發編程中線程池是使用非常多的一個併發框架,通過合理的使用線程池可以降低資源的消耗,提高響應的速度以及提高線程的可管理性。
那麼線程池的實現原理是什麼呢?
我們通過一個新的任務的處理流程來說明線程池的原理,當提交一個新的任務到線程池時,線程池判斷corePool中的線程是否都在執行任務,如果不是的話,就創建一個新的線程來執行這個任務,否則,就會判斷BlockingQueue是否已滿,如果BlockingQueue沒有滿,就把這個任務存儲在裡面,如果BlockingQueue已經滿了,線程池會判斷線程池中的線程是否都處於工作狀態,如果沒有的話,就會創建一個新的線程來執行任務,否則就會把這個任務交給飽和策略來處理。
如上圖所示就是線程池大致的處理流程。
在這裡解釋下corePoolSize、BlockingQueue、maximumPoolSize是什麼意思。
corePoolSize:核心線程池的大小,即核心線程池的線程數量。如果核心線程池中線程數量小於這個值,就創建線程來處理任務。
BlockingQueue:是一個隊列,用於存放任務的隊列,當核心線程池已滿,隊列未滿,任務就存放到隊列中。
maximumPoolSize:線程池的最大線程數量,如果隊列已滿,但是線程池數量還沒有達到這個值,就創建線程來處理。
那麼線程池具體的執行步驟是怎麼樣的呢?
線程池的execute()方法執行任務的結果有四種情況:
1.如果當前運行的線程數量小於corePoolSize,則創建一個新的線程來執行任務。
2.如果運行的線程數量大於corePoolSize,則把這個任務加入到BlockingQueue中。
3.如果BlockingQueue已滿,則任務無法加入到隊列中,那麼就創建新的線程來執行這個任務。
4.如果當前運行的線程數量已經等於maximumPoolSize,線程池就會通過策略拒絕這個任務。
線程池的執行示意圖如下:
瞭解了線程池的執行過程及原理,再看下線程池的使用吧,主要是線程池幾個參數的設置。
<code>ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor
(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);/<code>
我們可以看到可以設置的參數有corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler這幾個,corePoolSize和maximumPoolSize已經解釋過了,我們就來解釋下另外幾個參數都是什麼意思。
keepAliveTime:線程的存活時間,當線程沒有任務執行時,保持存活的時間,當一個線程空閒的時間超過這個值,就會銷燬這個線程。
unit:是keepAliveTime的時間單位,可選的單位有天,小時,秒等。
workQueue:它決定了緩存任務的排隊策略,對於不同的場景使用不同的阻塞隊列,常用的阻塞隊列有2種,SynchronousQueue和LinkedBlockingQueue。
threadFactory:用於設置創建線程的工廠,可以通過線程工廠給每個創建出來的線程設置一個有意義的名字。
handler:線程池的處理策略,當線程池的線程達到maximumPoolSize後,線程池就不會再創建線程來處理任務,就需要通過線程池的處理策略來處理該任務。
線程池就到這裡了,感覺有用的小夥伴點個贊呀。
閱讀更多 JAVA異世界 的文章