經過ThreadPoolExecutor
來建立一個線程池java
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, threadFactory,handler);
參數說明:git
corePoolSize
線程池中任務的基本個數
maximumPoolSize
線程chi池中任務的作多個數
keepAliveTime
線程池的工做線程空閒後存活的時間milliseconds
配合上個參數使用,表示時間的單位,如TimeUnit.SECONDS
runnableTaskQueue
排隊隊列
ArrayBlockingQueue
基於數組結構的有界阻塞隊列,此隊列按 FIFO(先進先出)原則對元素進行排序LinkedBlockingQueue
基於鏈表結構的阻塞隊列,此隊列按FIFO (先進先出) 排序元素,吞吐量一般要高於ArrayBlockingQueueSynchronousQueue
一個不存儲元素的阻塞隊列。每一個插入操做必須等到另外一個線程調用移除操做,不然插入操做一直處於阻塞狀態,吞吐量一般要高於LinkedBlockingQueuePriorityBlockingQueue
一個具備優先級得無限阻塞隊列threadFactory
建立線程的工廠,一般會從新指定線程名,方便debughandler
線程池飽和策略
CallerRunsPolicy
只用調用者所在線程來運行任務DiscardOldestPolicy
丟棄隊列裏最近的一個任務,並執行當前任務DiscardPolicy
不處理,丟棄掉AbortPolicy
拋異常線程池提交任務的處理流程數據庫
execute(Runnable)
直接執行一個實現了Runnable的接口,即表示提交了一個異步任務給線程池數組
submit(Runnable)
相比較於上面的,區別是這個會返回一個 Future<V>
對象,經過調用future.get()
能夠獲取線程的返回值,其中這個方程是線程阻塞的,直到返回告終果以後,纔會繼續執行下去微信
線程池的shutdown或shutdownNow方法來關閉線程池框架
shutdown的原理是隻是將線程池的狀態設置成SHUTDOWN狀態,而後中斷全部沒有正在執行任務的線程異步
shutdownNow的原理是遍歷線程池中的工做線程,而後逐個調用線程的interrupt方法來中斷線程,因此沒法響應中斷的任務可能永遠沒法終止ui
調用了這兩個關閉方法的其中一個,isShutdown方法就會返回true。當全部的任務都已關閉後,才表示線程池關閉成功,這時調用isTerminaed方法會返回true。.net
至於咱們應該調用哪種方法來關閉線程池,應該由提交到線程池的任務特性決定,一般調用shutdown來關閉線程池,若是任務不必定要執行完,則能夠調用shutdownNow線程
分析
獲取線程數
Runtime.getRuntime().availableProcessors()
背景:
實現一個異步的報警case,首先是有三種報警方式,郵件、微信、短信;其次是具體的報警都是異步處理(一個報警執行的線程池);要求一分鐘內報警有上限設置(即要實現報警的計數與清零);報警的重要性根據郵件-》微信-》短信進行遞增,當超過每一個報警類型的最低閥值時,晉升報警類型
silver-alarm
一個報警的基本框架