任务队列BlockingQueue
排队原则
1. 如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。
2. 如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列【注意:此队列必须有缓存,比如SynchronousQueue就没缓存功能】,而不添加新的线程。
3. 如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。
常见几种BlockingQueue实现
1. ArrayBlockingQueue : 有界的数组队列
2. LinkedBlockingQueue : 可支持有界/无界的队列,使用链表实现
3. PriorityBlockingQueue : 优先队列,可以针对任务排序
4. SynchronousQueue : 队列长度为1的队列,和Array有点区别就是:client thread提交到block queue会是一个阻塞过程,直到有一个worker thread连接上来poll task。