package com.company.thread_pool;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
//7种参数
public class SevenKindsOfParameters {
// public ThreadPoolExecutor(int corePoolSize, //1、核心线程池大小
// int maximumPoolSize, //2、最大核心线程池大小
// long keepAliveTime, //3、超时没有调用就会释放
// TimeUnit unit, //4、超时单位
// BlockingQueue<Runnable> workQueue, //5、阻塞队列
// ThreadFactory threadFactory //6、线程工厂,一般不修改
// RejectedExecutionHandler handle //7、拒绝策略
}
package com.company.thread_pool;
import java.util.concurrent.*;
/**4种拒绝策略:
* new ThreadPoolExecutor.AbortPolicy() // 银行满了,还有人进来,不处理这个人的,抛出异常
* new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里!
* new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢掉任务,不会抛出异常!
* new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了,尝试去和最早的竞争,也不会
抛出异常!
*/
/**maximumPoolSize该如何设置:
* 1、CPU密集型:几核就是几,可以保存CPU的效率最高!
* 2、IO密集型:判断你程序中十分耗费IO的线程
*
* 获取CPU的核数:
*Runtime.getRuntime().availableProcessors()
*/
public class RejectionPolicies {
public static void main(String[] args) {
//不推荐使用3大方法
//自定义线程池
ExecutorService threadPool = new ThreadPoolExecutor(
2,
5,
3,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),
//一种拒绝策略(队列满了,尝试和最早的去竞争,也不会抛出异常)
new ThreadPoolExecutor.DiscardOldestPolicy()
//new ThreadPoolExecutor.CallerRunsPolicy()
//new ThreadPoolExecutor.AbortPolicy()
//new ThreadPoolExecutor.DiscardPolicy()
);
try{
//9 > 5(maximumPoolSize) + 3(阻塞队列) ,让最后一个线程尝试和第一个竞争
for (int i = 0; i < 9; i++) {
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+"ok");
});
}
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭线程池
threadPool.shutdown();
}
}
}