JAVA线程池队列

ThreadPoolExecutor构造器中BlockingQueue的描述

JDK8中的队列实现

SynchronousQueue

直接提交的队列
默认使用: newCachedThreadPool

该队列没有容量,只有一个元素存在,每一个插入操作都要等待对应的删除操作,每一个删除操作也需要等待对于的插入操作
需要注意最大线程数的设置,避免操作被拒绝,是一个公平队列,先进先出

ArrayBlockingQueue

有界堵塞队列

使用数组实现,任务队列放满之后才会将线程池从corePoolSize进行提升,注重保持在核心数量,是一个公平队列,先进先出

LinkedBlockingQueue

有界堵塞队列
默认使用: newFixedThreadPool、newSingleThreadExecutor

使用链表实现,默认大小是Integer.MAX_VALUE,所以最好手动指定大小,每个提交的任务都会储存在一个node对象中,实现了锁分离,添加和移除任务各有一把锁,是一个公平队列,先进先出

DelayedWorkQueue

无界堵塞队列
默认使用: ScheduledThreadPoolExecutor、newSingleThreadScheduledExecutor

可以按照任务优先级执行,采用消费者-生产者模式进行消费

PriorityBlockingQueue

优先任务队列

是一种特殊的无界队列,可以按照任务优先级执行,元素可以实现Comparable接口,不允许为null

DelayQueue

无界堵塞队列

每个元素都会有一定的延时,然后释放

LinkedBlockingDueue

有界堵塞队列

使用链表实现,允许从双端进行插入和删除,默认大小是Integer.MAX_VALUE,所以最好手动指定大小,每个提交的任务都会储存在一个node对象中,实现了锁分离,添加和移除任务各有一把锁,任务队列放满之后才会将线程池从corePoolSize进行提升,注重保持在核心数量,是一个公平队列,先进先出

LinkedTransferQueue

无界堵塞队列

使用链表实现,采用消费者-生产者模式进行消费,是一个公平队列,先进先出

线程池不同队列如何运行

有界队列工作步骤

  1. 如果实际线程数小于corePoolSize,则优先创建新的线程
  2. 若大于corePoolSize,加入等待队列

    无界队列工作步骤

  3. 如果实际线程数小于corePoolSize,则优先创建新的线程
  4. 若大于corePoolSize,加入等待队列
  5. 若等待队列已满,无法加入,并且总线程数不超过maxSize则创建新的进程执行任务
  6. 若大于maxSize则执行拒绝策略

    直接提交队列工作步骤

  7. 提交给线程执行
  8. 如果没有空闲线程,则会创建新的线程
  9. 如果已经达到maxSize最大值则执行拒绝策略