创建线程池参数详解
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
- 核心线程池(corePoolSize)
线程池的大小,当核心线程池未满时,任务首先会进入此处 - 最大线程数(maximumPoolSize)
最大线程数的数量等于核心线程池的大小加上阻塞队列的大小 - 线程存活时间(keepAliveTime)
阻塞队列中的线程等待时间 - 时间单位(unit)
阻塞队列中的线程等待时间 - 阻塞队列(workQueue)
添加任务是,如果核心线程池满了,会进入阻塞队列 - 线程工厂(threadFactory)
可以自定义线程参数(比如线程名字) - 拒绝策略(handler)
达到最大线程池数量的大小之后,再有任务添加,会执行该策略
任务进入线程池时,首先会进入核心线程池,直到达到核心线程数量,如果在有任务添加,会进入阻塞队列,当添加的任务数量达到最大线程池数量时如果有任务添加,会执行拒绝策略。
- 阻塞队列
- ArrayBlockingQueue:由数组结构组成的有界阻塞队列
- LinkedBlockingQueue:由链表结构组成的有界阻塞队列(默认值:Integer.MAX_VALUE)
- PriorityBlockingQueue:支持优先级排序的无界阻塞队列
- DelayQueue:使用优先级队列实现的延迟无界阻塞队列
- SynchronousQueue:不存储元素的阻塞队列,即单个元素的队列
- LinkedTransferQueue:有链表结构组成的无界阻塞队列
- LinkedBlockingDeque:有链表结构组成的双向阻塞队列
- 拒绝策略
- AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止程序正常运行。
- CallerRunsPolicy:该策略既不会抛弃任务,也不会抛出异常,而是将任务退回到调用者执行。
- DiscardOldestPolicy:抛弃队列中等待最久的任务,然后将新任务加入队列。
- DiscardPolicy:直接丢弃任务,不予任务处理也不抛出异常。
计算设置线程池最大线程数
- 服务器是CPU密集型:CPU核数+1
- 服务器是IO密集型
- 由于IO密集型任务线程不是一直在执行任务,则尽量配置多的线程(CPU核数*2)
- CPU核数/1-阻塞系数(阻塞系数一般在0.8~0.9之间)