🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 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 ```