线程池入参 7个参数
corePoolSize,maxPoolSize,workQueue,threadFactory,handler,keepAliveTime,unit
申请线程
- 小于corePoolSize,则新建线程
- 等于corePoolSize,workQueue不满,则放入workQueue
- 大于等于corePoolSize,小于maxPoolSize,workQueue满了,则申请新线程
- 等于maxPoolSize,则执行拒绝策略
释放线程
当线程数量大于corePoolSize,线程空闲时间超过keepAliveTime则被释放
handler 4种拒绝策略
- 抛出异常RejectedExecutionException
- 直接在当前运行的线程执行任务
- 丢弃队列中最早的线程
- 丢弃当前任务,什么也不做
workQueue的存在就是减少线程的创建以及销毁,-Xss可以调整线程栈大小,默认是1M,设想如果1000个线程就是1个G内存啊。
WorkQueue 4种实现
- ArrayBlockingQueue 基于数组的有界阻塞队列,先进先出
- LinkedBlockingQueue 基于链表的无界阻塞队列,先进先出
- SynchronousQueue 同步队列,不存储元素
- PriorityBlockingQueue 具有优先级的无界阻塞队列
无界队列maxPoolSize就可以任务无效了