java 線程池的原理及使用

在java併發編程中線程池是使用非常多的一個併發框架,通過合理的使用線程池可以降低資源的消耗,提高響應的速度以及提高線程的可管理性。

那麼線程池的實現原理是什麼呢?

我們通過一個新的任務的處理流程來說明線程池的原理,當提交一個新的任務到線程池時,線程池判斷corePool中的線程是否都在執行任務,如果不是的話,就創建一個新的線程來執行這個任務,否則,就會判斷BlockingQueue是否已滿,如果BlockingQueue沒有滿,就把這個任務存儲在裡面,如果BlockingQueue已經滿了,線程池會判斷線程池中的線程是否都處於工作狀態,如果沒有的話,就會創建一個新的線程來執行任務,否則就會把這個任務交給飽和策略來處理。


java 線程池的原理及使用

如上圖所示就是線程池大致的處理流程。

在這裡解釋下corePoolSize、BlockingQueue、maximumPoolSize是什麼意思。

corePoolSize:核心線程池的大小,即核心線程池的線程數量。如果核心線程池中線程數量小於這個值,就創建線程來處理任務。

BlockingQueue:是一個隊列,用於存放任務的隊列,當核心線程池已滿,隊列未滿,任務就存放到隊列中。

maximumPoolSize:線程池的最大線程數量,如果隊列已滿,但是線程池數量還沒有達到這個值,就創建線程來處理。

那麼線程池具體的執行步驟是怎麼樣的呢?

線程池的execute()方法執行任務的結果有四種情況:

1.如果當前運行的線程數量小於corePoolSize,則創建一個新的線程來執行任務。

2.如果運行的線程數量大於corePoolSize,則把這個任務加入到BlockingQueue中。

3.如果BlockingQueue已滿,則任務無法加入到隊列中,那麼就創建新的線程來執行這個任務。

4.如果當前運行的線程數量已經等於maximumPoolSize,線程池就會通過策略拒絕這個任務。

線程池的執行示意圖如下:


java 線程池的原理及使用

瞭解了線程池的執行過程及原理,再看下線程池的使用吧,主要是線程池幾個參數的設置。

<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 線程池的原理及使用



分享到:


相關文章: