面試題之使用無界佇列的執行緒池會導致記憶體飆公升嗎?

2022-05-07 03:09:11 字數 1318 閱讀 8898

答案:會;

分析:建立執行緒池方式有如下幾種:

executors.newfixedthreadpool(10);//

linkedblockingqueue 無限加入佇列

executors.newscheduledthreadpool(10);//

delayedworkqueue 佇列如果滿了,阻塞

executors.newsinglethreadscheduledexecutor();//

delayedworkqueue 佇列如果滿了,阻塞

executors.newcachedthreadpool();//

synchronousqueue 佇列如果滿了,拋異常

executors.newsinglethreadexecutor();//

linkedblockingqueue 無限加入佇列

jdk7提供了7個阻塞佇列,分別是:

arrayblockingqueue:乙個由陣列結構組成的有界阻塞佇列

linkedblockingqueue:乙個由鍊錶結構組成的有界阻塞佇列

priorityblockingqueue:乙個支援優先順序排序的無界阻塞佇列

delayqueue:乙個使用優先順序佇列實現的無界阻塞佇列

synchronousqueue:乙個不儲存元素的阻塞佇列

linkedtransferqueue:乙個由鍊錶結構組成的無界阻塞佇列

linkedblockingdueue:乙個 由鍊錶結構組成的雙向阻塞佇列

public

static executorservice newfixedthreadpool(int

nthreads)

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue)

引數說明:

執行緒池工作原理**:

linkedblockingqueue預設的最大任務數量是integer.max_value,非常大,可以理解為無限大吧;但是存在這種情況,當每個執行緒獲取到乙個任務後,執行時間比較長,導致workqueue裡積壓的任務越來越多,機器的記憶體使用不停的飆公升,最後也會導致oom。

面試題之使用無界佇列的執行緒池會導致記憶體飆公升嗎?

答案 會 分析 建立執行緒池方式有如下幾種 executors.newfixedthreadpool 10 linkedblockingqueue 無限加入佇列 executors.newscheduledthreadpool 10 delayedworkqueue 佇列如果滿了,阻塞 execut...

執行緒池面試題一

1.執行緒池執行流程 2.執行緒池的執行緒是如何做到復用的 執行緒池中的執行緒在迴圈中嘗試取任務執行,這一步會被阻塞,如果設定了allowcorethreadtimeout為true,則執行緒池中的所有執行緒都會在keepalivetime時間超時後還未取到任務而退出。或者執行緒池已經stop,那麼...

java 面試題 記憶體池 程序池 執行緒池

自定義記憶體池的思想通過這個 池 字表露無疑,應用程式可以通過系統的記憶體分配呼叫預先一次性申請適當大小的記憶體作為乙個記憶體池,之後應用程式自己對記憶體的分配和釋放則可以通過這個記憶體池來完成。只有當記憶體池大小需要動態擴充套件時,才需要再呼叫系統的記憶體分配函式,其他時間對記憶體的一切操作都在應...