内置线程池的默认实现
- FixedThreadPool 和 SingleThreadPool
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM
- CachedThreadPool 和 ScheduledThreadPool
允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM
线程池的参数
-
corePoolSize:核心线程池数量
-
maximumPoolSize:最大线程数量
-
keepAliveTime:空闲线程存活时间
-
unit:时间单位
-
workQueue:工作队列
-
threadFactory:线程工厂
-
RejectedExecutionHandler:拒绝策略,当工作队列达到了最大限制,如果有新的任务来了该怎么处理。
当有任务来的时候,线程开始创建,直到最大线程数;如果还有新的任务进来,需要添加到工作队列;如果存在线程空闲,且空闲时间大于设置时间,线程池开始回收线程,直到核心线程数。线程池一般情况下,会维持核心线程存活;当工作队列中线程满了,线程池会使用拒绝策略来处理多出来的线程。
阻塞队列
- ArrayBlockingQueue:有界阻塞队列
- LinkedBlockingQuene:无界阻塞队列(其实最大容量为Interger.MAX)
- SynchronousQuene:一个不缓存任务的阻塞队列
- PriorityBlockingQueue:具有优先级的无界阻塞队列
拒绝策略
- CallerRunsPolicy:调用者线程中直接执行被拒绝任务的run方法
- AbortPolicy:直接丢弃任务,并抛出RejectedExecutionException异常
- DiscardPolicy:直接丢弃任务,什么都不做
- DiscardOldestPolicy:抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列