ThreadPool用法與優勢

2021-08-05 23:57:57 字數 2711 閱讀 2634

合理利用執行緒池能夠帶來三個好處。

執行緒池的建立
我們可以通過threadpoolexecutor來建立乙個執行緒池。

new  threadpoolexecutor(corepoolsize, maximumpoolsize, keepalivetime, milliseconds,runnabletaskqueue, handler);
建立乙個執行緒池需要輸入幾個引數:

keepalivetime(執行緒活動保持時間):執行緒池的工作執行緒空閒後,保持存活的時間。所以如果任務很多,並且每個任務執行的時間比較短,可以調大這個時間,提高執行緒的利用率。

timeunit(執行緒活動保持時間的單位):可選的單位有天(days),小時(hours),分鐘(minutes),毫秒(milliseconds),微秒(microseconds, 千分之一毫秒)和毫微秒(nanoseconds, 千分之一微秒)。

向執行緒池提交任務我們可以使用execute提交的任務,但是execute方法沒有返回值,所以無法判斷任務是否被執行緒池執行成功。通過以下**可知execute方法輸入的任務是乙個runnable類的例項。

threadspool.execute(new runnable() 

});

我們也可以使用submit 方法來提交任務,它會返回乙個future,那麼我們可以通過這個future來判斷任務是否執行成功,通過future的get方法來獲取返回值,get方法會阻塞住直到任務完成,而使用get(long timeout, timeunit unit)方法則會阻塞一段時間後立即返回,這時有可能任務沒有執行完。

future future = executor.submit(harreturnvaluetask);

try catch (interruptedexception e) catch (executionexception e) finally

執行緒池的關閉
我們可以通過呼叫執行緒池的shutdown或shutdownnow方法來關閉執行緒池,它們的原理是遍歷執行緒池中的工作執行緒,然後逐個呼叫執行緒的interrupt方法來中斷執行緒,所以無法響應中斷的任務可能永遠無法終止。但是它們存在一定的區別,shutdownnow首先將執行緒池的狀態設定成stop,然後嘗試停止所有的正在執行或暫停任務的執行緒,並返回等待執行任務的列表,而shutdown只是將執行緒池的狀態設定成shutdown狀態,然後中斷所有沒有正在執行任務的執行緒。

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

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

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

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

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

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

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

public

void

execute(runnable command)

//如果執行緒池不處於執行中或任務無法放入佇列,並且當前執行緒數量小於最大允許的執行緒數量,

則建立乙個執行緒執行任務。

else

if (!addifundermaximumpoolsize(command))

//丟擲rejectedexecutionexception異常

reject(command); // is shutdown or saturated}}

工作執行緒。執行緒池建立執行緒時,會將執行緒封裝成工作執行緒worker,worker在執行完任務後,還會無限迴圈獲取工作佇列裡的任務來執行。我們可以從worker的run方法裡看到這點:

public

void

run()

} finally

}

要想合理的配置執行緒池,就必須首先分析任務特性,可以從以下幾個角度來進行分析:

通過執行緒池提供的引數進行監控。執行緒池裡有一些屬性在監控執行緒池的時候可以使用

protected

void

beforeexecute(thread t, runnable r)

C 執行緒池ThreadPool的用法簡析

什麼是執行緒池?為什麼要用執行緒池?怎麼用執行緒池?1.什麼是執行緒池?net framework的threadpool類提供乙個執行緒池,該執行緒池可用於執行任務 傳送工作項 處理非同步 i o 代表其他執行緒等待以及處理計時器。那麼什麼是執行緒池?執行緒池其實就是乙個存放執行緒物件的 池子 po...

優勢與不足

ted的乙個很有意思的演講,我覺得很受啟發。大概意思就是,我們要進行多個方面的任務切換,不能夠總是專注於乙個領域。可能類似於流水線,但同時強調慢過程,一點點打磨,這反而是一件非常高效的事情。首先,關注不同的領域,可以讓你在一件事遇到困難時,切換到另外乙個工作狀態,從而持續興奮的去工作。比如說馬斯克,...

HDFS 優勢與弊端

乙個hdfs例項有可能包含數百台或數千台伺服器,每乙個臺機器都儲存檔案系統資料的一部分,這種情況下硬體故障是常態。而hdfs可檢測故障並從中快速自動恢復。hdfs設計用於批處理而不是使用者的互動式使用,其重點是資料訪問的高吞吐量而並不追求資料訪問的低延遲。hdfs的核心目標就是為處理具有大資料量的應...