package com.xiangshuai.test;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 文件在 E:(我的網盤\我的筆記)\學習文檔子目錄壓縮\併發技術\J2SE多線程基礎\線程池\線程池及拒絕策略的基本使用\Thread6Demo.java
* @author lqx
* 線程池的使用,只有定長的線程池纔有必要做一些
* 核心線程數,最大線程數,設置ArrayBlockingQueue這種有界隊列,
* 以及當隊列滿了後繼續創建最大線程數又滿了後,
* new ThreadPoolExecutor.設置拒絕策略
* 拒絕策略提供頂級接口 RejectedExecutionHandler ,其中方法 rejectedExecution 即定製具體的拒絕策略的執行邏輯。
jdk默認提供了四種拒絕策略:CallerRunsPolicy - 當觸發拒絕策略,只要線程池沒有關閉的話,則使用調用線程直接運行任務。
一般併發比較小,性能要求不高,不允許失敗。但是,由於調用者自己運行任務,如果任務提交速度過快,可能導致程序阻塞,性能效率上必然的損失較大
AbortPolicy - 丟棄任務,並拋出拒絕執行 RejectedExecutionException 異常信息。線程池默認的拒絕策略。必須處理好拋出的異常,否則會打斷當前的執行流程,影響後續的任務執行。
DiscardPolicy - 直接丟棄,其他啥都沒有
DiscardOldestPolicy - 當觸發拒絕策略,只要線程池沒有關閉的話,丟棄阻塞隊列 workQueue 中最老的一個任務,並將新任務加入
* */
public class Thread6Demo {
public static int count=1;
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor tpool = new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(8), new ThreadPoolExecutor.CallerRunsPolicy());
for(int i=0;i<19;i++){
try {
tpool.execute(new Threadt());
} catch (Exception e) {
e.printStackTrace();
System.out.println("出現異常"+count++);
}
}
}
}
class Threadt implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"--"+Thread6Demo.count++);
try {
Thread.sleep(9000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}