ThreadPoolExecutor構造方法的最后一個參數(shù)指定了拒絕策略.當提交給線程池的任務量超過實際承載能力時,如何處理? 即線程池中的線程已經(jīng)用完了,等待隊列也滿了,無法為新提交的任務服務,可以通過拒絕策略來處理這個問題. JDK提供了四種拒絕策略:
● AbortPolicy策略,會拋出異常。
● CallerRunsPolicy策略,只要線程池沒關閉,會在調用者線程中運行當前被丟棄的任務。
● DiscardOldestPolicy將任務隊列中最老的任務丟棄,嘗試再次提交新任務。
● DiscardPolicy直接丟棄這個無法處理的任務。
Executors工具類提供的靜態(tài)方法返回的線程池默認的拒絕策略是AbortPolicy拋出異常,如果內置的拒絕策略無法滿足實際需求,可以擴展RejectedExecutionHandler接口。
package com.wkcto.threadpool;
import java.util.Random;
import java.util.concurrent.*;
/**
* 自定義拒絕策略
*/
public class Test03 {
public static void main(String[] args) {
//定義任務
Runnable r = new Runnable() {
@Override
public void run() {
int num = new Random().nextInt(5);
System.out.println(Thread.currentThread().getId() + "--" + System.currentTimeMillis() + "開始睡眠" + num + "秒");
try {
TimeUnit.SECONDS.sleep(num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//創(chuàng)建線程池, 自定義拒絕策略
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 5, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10), Executors.defaultThreadFactory(), new RejectedExecutionHandler(){
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
//r就是請求的任務, executor就是當前線程池
System.out.println(r + " is discarding..");
}
});
//向線程池提交若干任務
for (int i = 0; i < Integer.MAX_VALUE; i++) {
threadPoolExecutor.submit(r);
}
}
}