ThreadPoolExecutor的構造函數比較複雜,最完備的構造有7個參數。html
ThreadPoolExecutor( //(線程數量)線程池最小線程數。 int corePoolSize, //線程池建立的最大線程數。 int maximumPoolSize, //當線程池中空閒線程數量超過corePoolSize時,多餘的線程會在多長時間內被銷燬。 long keepAliveTime, //keepAliveTime的單位。 TimeUnit unit, /** * 任務隊列, * 被添加到線程池中,但還沒有被執行的任務; * 它通常分爲直接提交隊列、有界任務隊列、無界任務隊列、優先任務隊列幾種; */ BlockingQueue<Runnable> workQueue, /** *線程工廠,用於建立線程,通常用默認便可。 */ ThreadFactory threadFactory, //自定義拒絕策略。當任務太多時如何拒絕任務。 RejectedExecutionHandler handler )
參數說明補充:java
handler:經過這個參數你能夠自定義任務的拒絕策略。若是線程池中全部的線程都在忙碌,而且工做隊列也滿了(前提是工做隊列是有界隊列),那麼此時提交任務,線程池就會拒絕接收。至於拒絕的策略, 你能夠經過handler這個參數來指定。ThreadPoolExecutor已經提供瞭如下4種策略。緩存
- CallerRunsPolicy:提交任務的線程本身去執行該任務。
- AbortPolicy:默認的拒絕策略,會throws RejectedExecutionException
- DiscardPolicy:直接丟棄任務,沒有任何異常拋出。
- DiscardOldestPolicy:丟棄最老的任務,其實就是把最先進入工做隊列的任務丟棄,而後把新任務加入 到工做隊列。
詳情:https://www.cnblogs.com/dafan...併發
ThreadPoolExecutor提供的3個submit()方法和1個FutureTask工具類來支持得到執行任務執行結果的需求:函數
// 提交Runnable任務 Future<?> submit(Runnable task); // 提交Callable任務 Future<T> submit(Callable<T> task); // 提交Runnable任務及結果引⽤ Future<T> submit(Runnable task, T result);
使用併發工具包Executors建立線程池(不建議使用)工具
//建立一個可緩存線程池,若是線程池長度超過處理須要,可靈活回收空閒線程,若無可回收,則新建線程。 ExecutorService executor1 = Executors.newCachedThreadPool(); //建立一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。 ExecutorService executor2 = Executors.newFixedThreadPool(10); //建立一個定長線程池,支持定時及週期性任務執行。 ExecutorService executor3 = Executors.newScheduledThreadPool (10); //建立一個單線程化的線程池,它只會用惟一的工做線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行。 ExecutorService executor4 = Executors.newSingleThreadExecutor ();
不建議使用Executors,Executors提供的不少方法默認使用都是無界的LinkedBlockingQueue, 高負載情境下,無界隊列很容易致使OOM,而OOM會致使全部請求都沒法處理,因此強力建議使用有界隊列。操作系統
無界隊列很容易致使OOM,而OOM會致使全部請求都沒法處理,因此強力建議使用有界隊列。線程
使用有界隊列,當任務過多時,線程池會觸發執行拒絕策略,線程默認的拒絕會。code
碼字不易若是對你有幫助請給個關注htm
愛技術愛生活 QQ羣: 894109590