int corePoolSize = 2;
int maximumPoolSize = 10;
int keepAliveTime = 60;
TimeUnit unit = TimeUnit.SECONDS;
ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);
ThreadFactory factory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r);
}
};
RejectedExecutionHandler executionHandler = new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// TODO Auto-generated method stub
}
};
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, unit, workQueue, factory, executionHandler);
参数说明从上到下
- 线程池核心线程数
- 线程池最大线程数
- 如果线程超过了核心线程数,那么多的那部分线程的最大空闲存活时间
- 时间的单位
- 线程池存放任务的队列
- 线程池如果创建线程
- 线程池不能处理跟过任务的时候,这个handler提供的rejectedExecution方法将会提供给用户来处理这些未被接受的任务、ThreadPoolExecutor提供了默认的处理策略(策略如下)
ThreadPoolExecutor.DiscardOldestPolicy ; //丢弃队列第一个任务,执行当前任务
ThreadPoolExecutor.DiscardPolicy; //空实现、不做任何处理(丢弃当前任务)
ThreadPoolExecutor.AbortPolicy; //抛出异常(丢弃当前任务)
ThreadPoolExecutor.CallerRunsPolicy; //由调度线程(客户端)执行任务
大概工作原理理解
当往线程池中提交任务的时候,如果队列数量达到最大了(如上是100,达到100以后执行后面的),那么线程池会开启新的线程来处理线程池中的任务、当队列达到最大,线程数也达到配置提供的最大线程数、那么再往队列提交任务,线程池会拒绝,此刻就有handler来处理了(比如记录日志,或者重试等等)