兩個好處:
1、執行緒可以重複利用,不用對同步任務進行不斷的建立銷毀
2、可以限制和管理資源,如執行緒
兩個結果組成:
set workers 表示每個正在跑的執行緒,在run中,先是處理第乙個task,處理完後會從workqueue中嘗試拿到乙個task進行處理,如果沒有,結束(keepalivetime可以調節結束的延時)、刪除這個worker
blockingqueueworkqueue 表示poolsize快要超出corepoolsize的時候,將物件放到阻塞佇列裡面去。如果阻塞佇列也放不進去,繼續放入workset集合裡面,如果workset超出了maximumpoolsize,就只能rejectedexecutionhandler來處理
shutdown 如果這個worker空閒了(如果執行緒正在跑,會有runlock鎖住,然後trylock返回false,就表示該worker不是空閒狀態),就interrupt這個worker對應的執行緒。(所以如果在run裡面做死迴圈的話,可以保證不是空閒的)
shutdownnow就不trylock,直接執行worker.thread.interrupt()
threadpoolexecutor狀態
running 表示接受新任務,同時處理佇列中已有的任務
shutdown(shutdown) 表示不接受新任務,但會等剩餘任務(包括workqueue裡面的任務)都執行完
stop(shutdownnow) 表示不接受新任務,不處理佇列中的任務,interrupt workers裡面的所有執行緒
terminate 表示所有的執行緒已經終止
executors.newfixedthreadpool(int nthreads)
建立的時候corepoolsize和maximumpoolsize一樣都是nthreads,queue為linkedblockingqueue。也就是說,如果workset放滿了,就放到queue裡面等待,如果queue也放滿了(基本不會出現這種情況,沒設值,預設為integer.max_value),就只能rejectexecutionhandler來處理。
executors.newcachedthreadpool()
建立的時候corepoolsize為0,maximumpoolsize為integer.max_value,queue為synchronousqueue。也就是說,先將任務放入queue裡面,如果workset裡面的poolsize為0,會在workset裡面建立乙個空任務去抓取synchronousqueue裡面的等待任務。如果不為0,就等待任務workset裡面的某個任務先處理完了再去抓。如果有新任務進來,先判斷是否能放入queue(這裡是synchronousqueue,只能放乙個),如果不能,就直接放入workset裡面。
兩種執行緒池缺點:
fixedthreadpool會出現記憶體不可控制的情況,因為linkedblockingqueue沒有數量限制。
cachedthreadpool更容易出現記憶體不可控制,因為maximumpoolsize為integer.max_value,很可能會建立許多執行緒(執行緒所佔的記憶體比乙個任務物件所佔記憶體肯定大很多)。所以它適合於任務小,處理速度非常快的場景
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...
執行緒 執行緒池
乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...
mysql 執行緒池 c MySQL執行緒池
mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...