ThreadPoolExecutor创建:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
参数说明:
- corePoolSize:核心线程池大小, 当新的任务到线程池后,线程池会创建新的线程(即使有空闲线程),直到核心线程池已满。
- maximumPoolSize:最大线程池大小,顾名思义,线程池能创建的线程的最大数目
- keepAliveTime:程池的工作线程空闲后,保持存活的时间
- TimeUnit: 时间单位BlockingQueue<Runnable>:用来储存等待执行任务的队列
- threadFactory:线程工厂
- RejectedExecutionHandler: 当队列和线程池都满了时拒绝任务的策略
重要参数说明:
corePoolSize 和 maximumPoolSize
- 默认情况下线程中的线程初始时为 0, 当有新的任务到来时才会创建新线程,当线程数目到达 corePoolSize 的数量时,新的任务会被缓存到 workQueue 队列中。
- 如果不断有新的任务到来,队列也满了的话,线程池会再新建线程直到总的线程数目达到 maximumPoolSize。
- 如果还有新的任务到来,则要根据 handler 对新的任务进行相应拒绝处理.
BlockingQueue<Runnable>
- 一个阻塞队列,用来存储等待执行的任务
- 常用队列:
- ArrayBlockingQueue
- 基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序
- LinkedBlockingQueue
- 一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue.
- 静态工厂方法Executors.newFixedThreadPool()使用了这个队列
- SynchronousQueue
- 不存储元素的阻塞队列
- 每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态
- 吞吐量通常要高于LinkedBlockingQueue
- 注: 静态工厂方法Executors.newCachedThreadPool使用了这个队列
- PriorityBlockingQueue
- 具有优先级得无限阻塞队列
- ArrayBlockingQueue
- RejectedExecutionHandler
- 线程池处于饱和状态时需要采取的应对策略
- dk提供策略:
- AbortPolicy:表示无法处理新任务时抛出异常, 默认策略
- CallerRunsPolicy:用调用者所在线程来运行任务
- DiscardOldestPolicy:该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务
- DiscardPolicy:不处理,丢弃掉
- 自定义策略:
- 实现 RejectedExecutionHandler 接口