生產者 數據中心 消費者 線程池Executors,四個最經典的方法newFixThreadPoll返回一個固定數量的線程池,若是執行的任務數大於線程數,會將新任務緩存到一個隊列中,這個隊列是newFixThreadPoll自帶的一個緩存區。newSingleExcutor()建立一個線程的線程池,newCacheThreadPoll()可根據實際狀況調整線程數量,不限制最大數量,有任務則建立空閒線程,空閒線程會在60秒後回收;newScheduleThreadpoll()方法,該方法返回一個ScheduleExecutorService對象,能夠實現定時器的功能,可是新項目都用spring schedule了。但該線程能夠指定線程數量。和newFixThreadPoll差很少,可是能夠實現定時器的功能。其實底層代碼實現的都是實例化threadPollExecutirsspring
使用有界隊列,當任務數小於核心線程數,則優先建立線程。若當前線程數大於核心線程數小於maxPoolSize,則將當前任務放入有界隊列,等待覈心線程有空餘,再執行隊列中的任務。若是隊列已滿,則直接建立線程,執行當前任務,若是當前線程任務數(不計算隊列中的,只計算正在執行的)大於maxPoolSize則執行拒絕策略 無界隊列 無界隊列以corePoolSize爲瓶頸,當任務數小於corePoolSize有新任務時則直接建立新線程,若是大於corePoolSize則將任務放入無界隊列。若是建立任務的速度大於任務處理的速度,則隊列的速度增加很快,直到計算機資源耗盡。此時maxPoolSize沒有任何意義緩存
jdk提供的拒絕策略 abortPolicy 默認的 直接拋出異常,組織系統正常工做 callerRunPolicy 只要線程池未關閉,直接在調用者線程中運行當前被丟棄的任務 DIscardoldestPolicy 丟棄最老的線程,執行當前任務 DiscardPolicy 直接不處理丟棄的任務 若是須要自定義拒絕策略,能夠實現rejectExecutorHandaler線程
大體的拒絕策略有兩種,經過http請求,通知數據源此任務執行失敗。或者記錄日子,指定定時任務,讀取日誌,之因此推薦日誌而不是暫存到緩存中,是由於決絕就是由於資源緊張,因此緩存和增長通知請求都顯得很不合理日誌