執行緒池相關 個人總結

2021-10-06 19:38:32 字數 2542 閱讀 9660

threadpoolexecutor mexecutor = new threadpoolexecutor(corepoolsize,// 核心執行緒數

maximumpoolsize, // 最大執行緒數

keepalivetime, // 閒置執行緒存活時間

timeunit.milliseconds,// 時間單位

new linkedblockingdeque(),// 執行緒佇列

executors.defaultthreadfactory(),// 執行緒工廠

new abortpolicy()// 佇列已滿,而且當前執行緒數已經超過最大執行緒數時的異常處理策略

);

如何配置

workqueue: 執行緒池所使用的緩衝佇列

直接提交 synchronousqueue

該佇列是將任務直接提交給執行緒而不儲存它們。在此,如果不存在空閒的執行緒,則試圖把任務加入佇列將失敗,因此會構造乙個新的執行緒。此策略可以避免在處理可能具有內部依賴性的請求集時出現鎖。直接提交通常要求無界 maximumpoolsizes 以避免拒絕新提交的任務。當命令以超過佇列所能處理的平均數連續到達時,此策略允許無界線程具有增長的可能性。           synchronousqueue執行緒安全的queue,可以存放若干任務(但當前只允許有且只有乙個任務在等待),其中每個插入操作必須等待另乙個執行緒的對應移除操作,也就是說a任務進入佇列,b任務必須等a任務被移除之後才能進入佇列,否則執行異常策略。你來乙個我扔乙個,所以說synchronousqueue沒有任何內部容量。

比如:核心執行緒數為2,最大執行緒數為3;使用synchronousqueue。

當前有2個核心執行緒在執行,又來了個a任務,兩個核心執行緒沒有執行完當前任務,根據如果執行的執行緒等於或多於 corepoolsize,

則 executor 始終首選將請求加入佇列,而不新增新的執行緒。所以a任務被新增到佇列,此時的佇列是synchronousqueue,

當前不存在可用於立即執行任務的執行緒,因此會構造乙個新的執行緒,此時又來了個b任務,兩個核心執行緒還沒有執行完。

新建立的執行緒正在執行a任務,所以b任務進入queue後,最大執行緒數為3,發現沒地方仍了。就只能執行異常策略(rejectedexecutionexception)。

無界佇列 如linkedblockingqueue

使用無界佇列(例如,不具有預定義容量的 linkedblockingqueue)將導致在所有核心執行緒都在忙時新任務在佇列中等待。這樣,建立的執行緒就不會超過 corepoolsize。(因此,maximumpoolsize 的值也就沒意義了。)也就不會有新執行緒被建立,都在那等著排隊呢。如果未指定容量,則它等於 integer.max_value。如果設定了queue預定義容量,則當核心執行緒忙碌時,新任務會在佇列中等待,直到超過預定義容量(新任務沒地方放了),才會執行異常策略。你來乙個我接乙個,直到我容不下你了。fifo,先進先出

有界佇列 如arrayblockingqueue

操作模式跟linkedblockingqueue查不多,只不過必須為其設定容量。所以叫有界佇列。new arrayblockingqueue(integer.max_value) 跟 new linkedblockingqueue(integer.max_value)效果一樣。linkedblockingqueue 底層是鍊錶結構,arrayblockingqueue  底層是陣列結構。你來乙個我接乙個,直到我容不下你了。fifo,先進先出。

rejectedexectutionhandler引數字段用於配置絕策略,常用拒絕策略如下

abortpolicy:用於被拒絕任務的處理程式,它將丟擲rejectedexecutionexception

callerrunspolicy:用於被拒絕任務的處理程式,它直接在execute方法的呼叫執行緒中執行被拒絕的任務。

discardoldestpolicy:用於被拒絕任務的處理程式,它放棄最舊的未處理請求,然後重試execute。

discardpolicy:用於被拒絕任務的處理程式,預設情況下它將丟棄被拒絕的任務

1.當乙個任務被提交到執行緒池時,首先檢視執行緒池的核心執行緒是否都在執行任務,否就選擇一條執行緒執行任務,是就執行第二步。

2.檢視核心執行緒池是否已滿,不滿就建立一條執行緒執行任務,否則執行第三步。

3.檢視任務佇列是否已滿,不滿就將任務儲存在任務佇列中,否則執行第四步。

4.檢視執行緒池是否已滿,不滿就建立一條執行緒執行任務,否則就按照策略處理無法執行的任務。

在threadpoolexecutor中表現為:

1.如果當前執行的執行緒數小於corepoolsize,那麼就建立執行緒來執行任務(執行時需要獲取全域性鎖)。

2.如果執行的執行緒大於或等於corepoolsize,那麼就把task加入blockqueue。

3.如果建立的執行緒數量大於blockqueue的最大容量,那麼建立新執行緒來執行該任務。

4.如果建立執行緒導致當前執行的執行緒數超過maximumpoolsize,就根據飽和策略來拒絕該任務。

面試相關 個人總結

問題一 這個專案中碰到過什麼問題,你是怎麼解決的,造成這個問題的原因是什麼 問題二 你學習 的時候有什麼收穫 問題三 你做的專案中有用到程序通訊或者執行緒通訊嗎?ccd專案中用到了執行緒通訊,執行緒之間可以通過共享的全域性變數進行通訊。能夠在多個執行緒裡共享全域性變數。例如才激動的明場和暗場的均值和...

執行緒池相關

介面 executor,executorservice,scheduledexecutorservice 抽象類 abstractexecutorservice 類 threadpoolexecutor,scheduledthreadpoolexecutor 1.分析threadpoolexecut...

多執行緒 執行緒池相關

銀行有四個視窗辦業務,好比四個cpu。如果只開乙個執行緒的話,相當於所有辦業務的人都排成一隊在乙個視窗辦業務,或者說每個人都必須等上乙個人辦完業務之後隨機選乙個視窗,總之就是序列乙個個來。所以這體現了多執行緒優點的就是可以充分利用現在計算機配置多核cpu的硬體特性,把多核cpu利用起來提高任務的處理...