執行緒池內部是乙個生產者-消費者模型:
可通過executors中的靜態工廠方法
建立不同特點的執行緒池,包括:
忽略workstealingpool,則其他執行緒池底層都使用了threadpoolexecutor,只是引數不同。
執行緒池就像水管,任務是水。
threadpoolexecutor.abortpolicy:丟棄任務並丟擲rejectedexecutionexception異常。
threadpoolexecutor.discardpolicy:也是丟棄任務,但是不丟擲異常。
threadpoolexecutor.discardoldestpolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)
threadpoolexecutor.callerrunspolicy:由呼叫執行緒處理該任務
觀察corepoolsize、maximumpoolsize、workqueue三者的關係可知:
為什麼要有+1呢?
這是因為,就算是計算密集型任務,也可能存在缺頁等問題(需要了解虛擬記憶體和物理記憶體的分配),產生「隱式」的io。多乙個額外的執行緒能確保cpu時鐘週期不會被浪費,又不至於增加太多執行緒排程成本。
假設每個執行緒的「等待時間 / 計算時間
」大小相等,顯然,「計算時間 / (計算時間 + 等待時間)
」也相等。對1個執行緒而言,只有計算時間占用了邏輯cpu
,假設這個執行緒一直執行在同1個邏輯cpu上,顯然,該邏輯cpu的cpu利用率
即等於「計算時間 / (計算時間 + 等待時間)
」。
對於多個執行緒的情況是一樣的,則有公式:
邏輯cpu數 * cpu利用率 / 執行緒數 = 計算時間 / (計算時間 + 等待時間)
==>>
邏輯cpu數可通過cat /proc/cpuinfo | grep -c processor得到。
標準的cpu利用率要通過實際監控得到,但在估算執行緒池大小時,應看做「期望得到的cpu利用率」,即可分配給該任務的cpu比例。如果只打算分配一半cpu給任務的話,就是0.5。
如果估算得到的執行緒數比較多,那麼還要適當提高可分配的cpu比例,因為執行緒切換的成本隨執行緒數增加而增加。如果競爭較激烈,則可以適當降低可分配的cpu比例,因為競爭通常也會導致執行緒阻塞,使cpu空閒。
Java執行緒池
executors類詳解 此包中所定義的 executor executorservice scheduledexecutorservice threadfactory 和 callable 類的工廠和實用方法。此類支援以下各種方法 建立並返回設定有常用配置字串的 executorservice 的...
Java執行緒池
一 執行緒池 單執行緒 public static void runsinglethreadpool public static void runsinglethreadpoolwithfactory private static class mythreadfactory implements t...
java 執行緒池
1.執行緒池的作用 限制系統中執行執行緒的數量 2.為什麼要用執行緒池 2.1.減少了建立和銷毀執行緒的次數,每個工作執行緒都可以被重複利用,可執行多個任務.2.2 可以根據系統的承受能力,調整執行緒池中工作線執行緒的數目,防止因為消耗過多的記憶體,而把伺服器累趴下。3.執行緒池介面類 3.1 ex...