1、线程池场创建
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();// 获取cpu个数
private static final ThreadFactory namedThreadFactory = (new ThreadFactoryBuilder()).setNameFormat("xxxxx-call-runner-%d").build();
private static final ExecutorService taskExe = new ThreadPoolExecutor(
//核心线程数
CPU_COUNT,
//最大线程数
CPU_COUNT * 5,
//多长时间把非核心空闲线程交还操作系统
1,
TimeUnit.MINUTES,
//阻塞队列 队列长度
new LinkedBlockingQueue(512),
//设置线程名
namedThreadFactory,
//拒绝策略 当提交任务数超过最大线程数+队列 之和时触发
new xxxxRejectedExecutionHandler()
);
2、默认拒绝策略(如:ThreadPoolExecutor.AbortPolicy)
2.1 AbortPolicy 默认拒绝策略、抛出异常
private static final RejectedExecutionHandler defaultHandler = new AbortPolicy();
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
e.toString());
}
2.2 CallerRunsPolicy 线程池没有关闭,线程直接运行
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
r.run();
}
}
2.3 DiscardPolicy 不处理
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
2.4 DiscardOldestPolicy 线程池没有关闭,会抛弃任务队列中最旧的任务,再把新任务添加进去。
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
if (!e.isShutdown()) {
e.getQueue().poll();
e.execute(r);
}
}
3、自定义策略(满了阻塞线程)
@Slf4j
public class xxxRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
try {
//满了就等待
executor.getQueue().put(r);
} catch (InterruptedException e) {
log.error("拒绝策略异常",e);
}
}
}