多執行緒 執行緒池

2022-07-28 06:51:15 字數 2938 閱讀 1915

executors.newfixedthreadpool(int):建立乙個固定執行緒數的執行緒池,其最大執行緒數跟核心執行緒數一樣大。使用linkblockingqueue.

public static executorservice newfixedthreadpool(int nthreads)
executors.newcachedthreadpool():保證每次請求都有執行緒執行,故每次的請求,如果沒有執行緒空閒,則直接建立乙個新的執行緒去執行,最大執行緒數是integer.max_value,在60s內沒有新任務,則銷毀。使用的是synchronousqueue.

public static executorservice newcachedthreadpool()
executors.newsinglethreadexecutor():單執行緒,

public static executorservice newsinglethreadexecutor()
4.executors.newscheduledthreadpool(int corepoolsize):建立乙個執行緒池,該執行緒池可以安排命令在給定延遲後執行或定期執行

public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize) 

// 其父類為threadpoolexecutor

public scheduledthreadpoolexecutor(int corepoolsize)

threadpoolexecutor 的構造方法:

//corepoolsize 核心執行緒數,maximumpoolsize 最大執行緒數,keepalivetime:當執行緒數大於核心時,這是多餘空閒執行緒在終止之前等待新任務的最長時間 ,unit:keepalivetime的時間單位,workqueue:使用的佇列,在執行任務之前用於儲存任務的佇列。此佇列將僅包含由方法提交的任務。

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue)

blockingqueue:

arrayblockingqueue:陣列阻塞佇列,乙個由陣列支援的有界阻塞佇列。此佇列按 fifo(先進先出)原則對元素進行排序。佇列的頭部 是在佇列中存在時間最長的元素。佇列的尾部 是在佇列中存在時間最短的元素。新元素插入到佇列的尾部,佇列獲取操作則是從佇列頭部開始獲得元素

delayqueue:delayed 元素的乙個無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部 是延遲期滿後儲存時間最長的 delayed 元素。如果延遲都還沒有期滿,則佇列沒有頭部,並且 poll 將返回 null。當乙個元素的 getdelay(timeunit.nanoseconds) 方法返回乙個小於等於 0 的值時,將發生到期。即使無法使用 take 或 poll 移除未到期的元素,也不會將這些元素作為正常元素對待。例如,size 方法同時返回到期和未到期元素的計數。此佇列不允許使用 null 元素

linkedblockingdeque:乙個基於已鏈結節點的、任選範圍的阻塞雙端佇列。可選的容量範圍構造方法引數是一種防止過度膨脹的方式。如果未指定容量,那麼容量將等於 integer.max_value。只要插入元素不會使雙端佇列超出容量,每次插入後都將動態地建立鏈結節點。大多數操作都以固定時間執行(不計阻塞消耗的時間)。異常包括 remove、removefirstoccurrence、removelastoccurrence、contains、iterator.remove() 以及批量操作,它們均以線性時間執行。

linkedblockingqueue:鏈阻塞佇列,linkedblockingqueue 類實現了 blockingqueue 介面。linkedblockingqueue 內部以乙個鏈式結構(鏈結節點)對其元素進行儲存。如果需要的話,這一鏈式結構可以選擇乙個上限。如果沒有定義上限,將使用 integer.max_value 作為上限。linkedblockingqueue 內部以 fifo(先進先出)的順序對元素進行儲存。佇列中的頭元素在所有元素之中是放入時間最久的那個,而尾元素則是最短的那個。

linkedtransferqueue:參考:

priorityblockingqueue:乙個無界阻塞佇列,它使用與類 priorityqueue 相同的順序規則,並且提供了阻塞獲取操作。雖然此佇列邏輯上是無界的,但是資源被耗盡時試圖執行 add 操作也將失敗(導致outofmemoryerror)。此類不允許使用 null 元素。依賴自然順序的優先順序佇列也不允許插入不可比較的物件(這樣做會導致丟擲 classcastexception)。此類及其迭代器可以實現 collection 和 iterator 介面的所有可選 方法。iterator() 方法中提供的迭代器並不 保證以特定的順序遍歷 priorityblockingqueue 的元素。如果需要有序地進行遍歷,則應考慮使用 arrays.sort(pq.toarray())。此外,可以使用方法 drainto 按優先順序順序移除 全部或部分元素,並將它們放在另乙個 collection 中。在此類上進行的操作不保證具有同等優先順序的元素的順序。如果需要實施某一排序,那麼可以定義自定義類或者比較器,比較器可使用修改鍵斷開主優先順序值之間的聯絡。例如,以下是應用先進先出 (first-in-first-out) 規則斷開可比較元素之間聯絡的乙個類。要使用該類,則需要插入乙個新的 fifoentry(anentry) 來替換普通的條目物件。

synchronousqueue:是乙個特殊的佇列,它的內部同時只能夠容納單個元素。如果該佇列已有一元素的話,試圖向佇列中插入乙個新元素的執行緒將會阻塞,直到另乙個執行緒將該元素從佇列中抽走。同樣,如果該隊列為空,試圖向佇列中抽取乙個元素的執行緒將會阻塞,直到另乙個執行緒向佇列中插入了一條新的元素。

多執行緒 執行緒池

第一 降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。第二 提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。第三 提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一分配 調優和監控...

多執行緒 執行緒池

執行緒池是什麼 執行緒池 thread pool 是一種基於池化思想管理執行緒的工具,經常出現在多執行緒伺服器中,如mysql。執行緒過多會帶來額外的開銷,其中包括建立銷毀執行緒的開銷 排程執行緒的開銷等等,同時也降低了計算機的整體效能。執行緒池維護多個執行緒,等待監督管理者分配可併發執行的任務。這...

多執行緒 執行緒池

執行緒池的作用 減少了每次建立 銷毀執行緒所帶來的損耗。執行緒池建立執行緒的簡易流程 文字描述 1 先判斷核心執行緒池 corepoolsize 是否已滿,沒滿就建立核心執行緒執行,滿了就進行下一判斷。2 判斷等待佇列 workqueue 是否已經滿了,沒滿就新增到等待佇列,滿了就進行下一判斷。3 ...