MST
星途 面试题库

面试题:Java中Java线程池的阻塞队列有哪些常见类型及特点

请列举Java线程池中常用的阻塞队列类型,并简要阐述每种阻塞队列的特点,例如容量限制、入队出队策略等。
29.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. ArrayBlockingQueue

    • 容量限制:有界队列,在创建时需指定容量大小。
    • 入队出队策略:基于数组实现,内部使用ReentrantLock进行线程安全控制,使用Condition实现等待和唤醒机制。入队(offerput等方法)时,如果队列已满,put方法会阻塞直到有空间可用,offer方法会返回false(非阻塞);出队(polltake等方法)时,如果队列已空,take方法会阻塞直到有元素可用,poll方法会返回null(非阻塞)。元素按FIFO(先进先出)顺序处理。
  2. LinkedBlockingQueue

    • 容量限制:可指定容量,也可使用无参构造创建一个默认容量为Integer.MAX_VALUE的无界队列。
    • 入队出队策略:基于链表实现,内部使用两把锁(takeLockputLock)分别控制出队和入队操作,提高并发性。入队(offerput等方法)和出队(polltake等方法)策略与ArrayBlockingQueue类似,元素按FIFO顺序处理。
  3. SynchronousQueue

    • 容量限制:容量为0,不存储任何元素。
    • 入队出队策略:每个插入操作必须等待另一个线程的移除操作,反之亦然。它支持公平性选择,构造时可传入fair参数,true表示公平模式,即按照FIFO顺序处理线程;false表示非公平模式。使用transfer方法时,如果没有消费者在等待接收元素,该方法会阻塞直到有消费者出现;offer方法是非阻塞的,如果没有消费者等待,立即返回false
  4. PriorityBlockingQueue

    • 容量限制:无界队列,会根据需要自动扩容。
    • 入队出队策略:基于堆数据结构实现,元素按照自然顺序或者自定义的比较器顺序排序。入队(offerput等方法)操作总是成功,因为队列是无界的。出队(polltake等方法)时会返回队列中优先级最高(排序最靠前)的元素。如果队列为空,take方法会阻塞直到有元素可用,poll方法会返回null
  5. DelayQueue

    • 容量限制:无界队列,会根据需要自动扩容。
    • 入队出队策略:队列中的元素必须实现Delayed接口,该接口继承自Comparable接口。元素只有在延迟时间到期后才能从队列中取出。入队操作(offerput等方法)总是成功,因为队列是无界的。出队(polltake等方法)时,poll方法如果队头元素延迟时间未到,返回nulltake方法会阻塞直到队头元素延迟时间到期。