import java.util.concurrent.*;
/** |-> 小於corePoolSize -> 分配線程執行
* 任務提交-> | |->成功->等待執行
* |-> 大於corePoolSize -> 提交到等待隊列 ->| |->達到maximumPoolSize線程,提交失敗->拒絕執行
* |->失敗->提交線程池->|
* |->未達到,提交成功->分配線程執行
*
* 自定義線程池和拒絕策略的使用
*/
public class RejectThreadPoolDemo {
public static class MyTask implements Runnable{
@Override
public void run() {
System.out.println(System.currentTimeMillis()+" Id:"+Thread.currentThread().getId());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException{
MyTask task = new MyTask();
/**
* public ThreadPoolExecutor(int corePoolSize, //指定線程池中線程數量
* int maximumPoolSize, //指定線程池中的最大線程數量
* long keepAliveTime, //超過corePoolSize的空閑線程,在多長時間內會被銷毀
* TimeUnit unit, //keepAliveTime的單位
* BlockingQueue<Runnable> workQueue,//任務隊列
* ThreadFactory threadFactory,//線程工廠,一般默認即可
* RejectedExecutionHandler handler) {//拒絕策略,當任務太多來不及處理,如何拒絕任務
*/
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 0L,
TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(10),
Executors.defaultThreadFactory(), new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { //r:請求執行的任務 executor:當前的線程池
//打印丟失的任務
System.out.println(r.toString() + " is discard");
}
});
for (int i = 0; i < Integer.MAX_VALUE; i++) {
executor.submit(task);
Thread.sleep(10);
}
}
//1567644472625 Id:9
//1567644472631 Id:10
//1567644472646 Id:11
//1567644472654 Id:12
//1567644472665 Id:13
//java.util.concurrent.FutureTask@60e53b93 is discard
//java.util.concurrent.FutureTask@5e2de80c is discard
//。。。
}