您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

Java ExecutorService四種執行緒池

簡介newSingleThreadExecutor建立一個單執行緒化的執行緒池,只會用工作執行緒來執行任務,保證順序,示例如下控制檯資訊pool-1-thread-1,0pool-1-thread-1,1pool-1-thread-1,2poo

新的任務提交到執行緒池是如何處理的

Java ExecutorService四種執行緒池

1。引言

合理利用執行緒池能夠帶來三個好處。第一:降低資源消耗。透過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。第二:提高響應速度。當任務到達時,任務可以不需要的等到執行緒建立就能立即執行。第三:提高執行緒的可管理性。執行緒是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一的分配,調優和監控。但是要做到合理的利用執行緒池,必須對其原理了如指掌。

2。執行緒池使用

Executors提供的四種執行緒 1。newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。 2。newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。 3。newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。 4。newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。

1。newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。示例如下

Java ExecutorService四種執行緒池

2。newFixedThreadPool建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。示例如下

Java ExecutorService四種執行緒池

3。newScheduledThreadPool 建立一個定長執行緒池,支援週期和定時任務示例如下

Java ExecutorService四種執行緒池

控制檯訊息

before:1518013024

after :1518013024

延遲1秒之後,3秒執行一次:1518013025

延遲1秒之後,3秒執行一次:1518013028

延遲1秒之後,3秒執行一次:1518013031

4。newSingleThreadExecutor建立一個單執行緒化的執行緒池,只會用工作執行緒來執行任務,保證順序,示例如下

Java ExecutorService四種執行緒池

控制檯資訊

pool-1-thread-1,0

pool-1-thread-1,1

pool-1-thread-1,2

pool-1-thread-1,3

pool-1-thread-1,4

向執行緒池提交任務 ThreadPoolExecutor類中execute()和submit()區別 execute()方法實際上是Executor中宣告的方法,在ThreadPoolExecutor進行了具體的實現,這個方法是ThreadPoolExecutor的核心方法,透過這個方法可以向執行緒池提交一個任務,交由執行緒池去執行。

submit()方法是在ExecutorService中宣告的方法,在AbstractExecutorService就已經有了具體的實現,在ThreadPoolExecutor中並沒有對其進行重寫,這個方法也是用來向執行緒池提交任務的,但是它和execute()方法不同,它能夠返回任務執行的結果,透過原始碼檢視submit()方法的實現,會發現它實際上還是呼叫的execute()方法,只不過它利用了Future來獲取任務執行結果。

Java ExecutorService四種執行緒池

執行緒池的關閉 我們可以透過呼叫執行緒池的shutdown或shutdownNow方法來關閉執行緒池,但是它們的實現原理不同,shutdown的原理是隻是將執行緒池的狀態設定成SHUTDOWN狀態,然後中斷所有沒有正在執行任務的執行緒。shutdownNow的原理是遍歷執行緒池中的工作執行緒,然後逐個呼叫執行緒的interrupt方法來中斷執行緒,所以無法響應中斷的任務可能永遠無法終止。shutdownNow會首先將執行緒池的狀態設定成STOP,然後嘗試停止所有的正在執行或暫停任務的執行緒,並返回等待執行任務的列表。

只要呼叫了這兩個關閉方法的其中一個,isShutdown方法就會返回true。當所有的任務都已關閉後,才表示執行緒池關閉成功,這時呼叫isTerminaed方法會返回true。至於我們應該呼叫哪一種方法來關閉執行緒池,應該由提交到執行緒池的任務特性決定,通常呼叫shutdown來關閉執行緒池,如果任務不一定要執行完,則可以呼叫shutdownNow。

3。 執行緒池的分析

流程分析:執行緒池的主要工作流程如下圖: Java執行緒池主要工作流程

Java ExecutorService四種執行緒池

從上圖我們可以看出,當提交一個新任務到執行緒池時,執行緒池的處理流程如下:

首先執行緒池判斷基本執行緒池是否已滿?沒滿,建立一個工作執行緒來執行任務。滿了,則進入下個流程。

其次執行緒池判斷工作佇列是否已滿?沒滿,則將新提交的任務儲存在工作佇列裡。滿了,則進入下個流程。

最後執行緒池判斷整個執行緒池是否已滿?沒滿,則建立一個新的工作執行緒來執行任務,滿了,則交給飽和策略來處理這個任務。

原始碼分析。上面的流程分析讓我們很直觀的瞭解的執行緒池的工作原理,讓我們再透過原始碼來看看是如何實現的。執行緒池執行任務的方法如下:

Java ExecutorService四種執行緒池

工作執行緒。執行緒池建立執行緒時,會將執行緒封裝成工作執行緒Worker,Worker在執行完任務後,還會無限迴圈獲取工作佇列裡的任務來執行。

Top