### BlockingQueue
> 用于传输和保持提交的任务,使用该队列与池大小进行交互
> 排队有三种策略
#### SynchronousQueue
> **直接提交的队列**
> 默认选项
> 将任务直接提交给线程处理,而不保持它,如果没有空闲的进程,则尝试创建新的进程,如已达到最大值,则执行拒绝策略
#### LinkedBlockingQueue
> **有界的任务队列**
> 如有新的任务需要执行,如果线程池的实际线程数小于corePoolSize,则会优先创建新的线程,
> 若大于corePoolSize,则会将新任务加入等待队列。
> 若队列已满,无法加入,在总线程数,不大于maximumPoolSize的前提下,创建新的进程执行任务,
> 若大于maximumPoolSize,则执行拒绝策略
#### ArrayBlockingQueue
> **无界的任务队列**
> 除非资源耗尽,否则无界的任务队列不存在任务入队失败的情况。
> 当有新的任务到来,系统的线程数小于corePoolSize时,线程池会产生新的线程执行任务
> 当系统的线程数达到corePoolSize后,会继续增加。
> 若后续有新的任务加入,而又没有空闲的线程资源,则任务直接进入等待队列
> 若任务创建和处理的速度差异很大,无界队列会保持快速增长,直到耗尽系统内存。
#### PriorityBlockingQueue
> **任务优先队列**
> 可以控制任务的执行先后顺序
*****
```[flow]
st=>start: 开始
e=>end: 结束
op1=>operation: 提交任务
op2=>operation: 加入队列
op3=>operation: 分配线程执行
op4=>operation: 提交到线程池
op5=>operation: 等待执行
op6=>operation: 提交成功,分配线程执行
op7=>operation: 拒绝执行
cond1=>condition: 大于corePoolSize
?
cond2=>condition: 加入队列失败?
cond3=>condition: 小于maximumPoolSize?
st->op1->cond1(no)->op3->e
cond1(yes,right)->op2(right)->cond2(no)->op5->e
cond2(yes,right)->op4(right)->cond3(no)->op7->e
cond3(yes,right)->op6->e
```
- 虚拟机
- JVM内存结构
- JVM调优手段
- java对象生命周期
- 垃圾回收判断对象死亡
- 垃圾回收算法
- 垃圾收集器
- JAVA基础知识
- java事件机制
- java反射机制
- jvm创建对象
- java异常
- finally语句一定会执行吗?
- 集合类介绍
- ArrayList
- LinkedList
- HashMap
- ConcurrentHashMap
- 多线程
- 为什么要使用线程池
- 线程死锁
- 死锁检测和解除
- jstack
- jconsole
- 死锁预防
- 常见线程池
- 线程池参数
- 工作队列介绍
- 拒绝策略
- ThreadLocal
- CAS
- ReentrantLock
- AQS
- CountDownLatch
- Spring
- spring中bean的作用域
- REDIS
- redis数据结构
- redis hash实现
- redis rehash与hashmap扩容的区别
- Redis使用场景
- Redis为何这么快
- redis连接数不足导致错误
- 分布式
- 分布式事务
- ACID
- CAP
- BASE
- 事务隔离性
- 一致性哈希算法
- 负载均衡算法
- Hystrix 信号量和线程池隔离的差异
- Spring Cloud
- eureka
- MYSQL
- mysql优化经验
- undo redo binlog
- web
- http协议
- http和https区别
- Cookie和session
- TCP三次握手、4次挥手
- TCP的time_wait和close_wait
- 算法问题
- 编辑距离算法
- MQ
- RabbitMq
- Kafka
- 安装教程
- Win ELK安装