使用者提交任務
條件1.核心池已滿?==是==>2.佇列已滿?==是==>3.執行緒池已滿?==是==>按照策略執行不能處理的任務
|否 |否 |否
執行緒建立執行緒執行任務 將任務儲存到阻塞佇列 建立執行緒執行任務
(addworker) 執行緒主要的步驟 需要獲取全域性鎖,影響效能
在execte()中建立乙個新的執行緒(步驟1、3)
從阻塞佇列中取
直接丟擲異常 abortpolicy
只用呼叫者所在的執行緒來執行任務callerrunspolicy
對其佇列裡最老的乙個任務,並執行任務discardoldestpolocy
不處理,丟棄掉discardpolicy
任務的性質:cpu密集型,io密集型、混合型任務。cpu密集型的任務,應該配置盡可能小的執行緒,如配置num(cpu)+1個執行緒的執行緒池。由於io密集型的任務並不是一直在執行任務,就可以盡可能多的配置執行緒數量如2*num(cpu)。對於混合型的任務,可以拆分成cpu密集型和io密集型任務,只要這兩個任務執行的時間差相差不是太大,那麼分解後的吞吐量將高於序列時的吞吐量,如果二者相差很大,沒必要拆解。
任務的優先順序:可通過優先順序阻塞佇列prioriblockingqueue來處理。
任務的依賴性:是否依賴其他資源,如資料庫連線,執行緒數應該設定大一點
建議使用有界佇列,增加系統的穩定性和預警能力
taskcount,completedtaskcount,largestpoolsize,poolsize,activitecount
//todo 阻塞佇列,執行緒池框架
執行緒池的理解
原來一直對執行緒池心存疑惑.第乙個疑惑是.執行緒類在例項化的時候就已經指定了run函式了,也就是說,乙個執行緒在例項化的時候,他能做什麼就已經定下來了,要做別的事,就要新開乙個執行緒.這感覺就和執行緒池的思想違背了,怎麼樣從執行緒池裡面拿乙個執行緒出來就可以執行呢?執行完了然後再放回去呢?第二個疑惑...
執行緒池的理解
1.為什麼要使用多執行緒?充分利用cpu資源,併發去做多個事情 2.單核cpu機器適不適合用多執行緒?適合,如果是單執行緒,執行緒中需要等待io,此時cpu就空閒出來了 3.執行緒什麼時候讓出cpu?阻塞時,wait,await,等待io,sleep,yield,結束了 4.執行緒是什麼?程序的最小...
執行緒池的理解
學校組織體檢,有一項內容是抽血化驗.抽血是在乙個房間 執行緒池 裡進行,假設 房間裡面有6個核心視窗進行抽血 corepoolsize 如果來抽血化驗的人太多,核心視窗也可以擴容,最大可以擴充套件到10個視窗.maximumpoolsize 其中有6個核心視窗,和4個非核心視窗.非核心視窗在抽血化驗...