ThreadPoolExecutor的workQueue有哪些

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

在Java的java.util.concurrent包中,ThreadPoolExecutor是一个用于管理线程池的强大工具。它可以执行Runnable任务,并管理线程的创建、执行和回收。ThreadPoolExecutor使用一个工作队列(workQueue)来存储等待执行的任务。以下是几种常用的工作队列类型:

SynchronousQueue

SynchronousQueue 没有容量,每个插入操作必须等待另一个线程的对应移除操作,反之亦然。这个队列通常用于直接交付任务,如果没有可用线程来立即运行任务,那么会尝试创建一个新的线程。

LinkedBlockingQueue

LinkedBlockingQueue 是一个基于链表结构的阻塞队列,它可以选择性地构造成有界或无界的。如果初始化时没有指定容量,它等同于一个容量为Integer.MAX_VALUE的队列。通常用于任务队列,当线程池中的线程都在忙时,新任务会在队列中等待。

ArrayBlockingQueue

ArrayBlockingQueue 是一个基于数组结构的有界阻塞队列,这个队列按照先进先出(FIFO)的原则对元素进行排序。必须在构造时指定容量,并且有一个可选的公平性参数来控制线程获取任务的顺序。

PriorityBlockingQueue

PriorityBlockingQueue 是一个支持优先级排序的无界阻塞队列。优先级的判断通过实现Comparable接口或者提供Comparator来实现。这个队列不会阻塞数据的生产者,但是如果队列为空,消费者可能会被阻塞。

DelayQueue

DelayQueue 是一个使用优先级队列实现的无界阻塞队列,只有在延迟期满时元素才能从队列中取走。这种队列非常适合执行定时任务。

LinkedTransferQueue

LinkedTransferQueue 是一个由链表结构组成的无界阻塞队列。它还包含了transfer方法,可以用来直接交付任务给消费者。

LinkedBlockingDeque

LinkedBlockingDeque 是一个基于链表结构的双向阻塞队列,既可以从队列的头部取元素,也可以从尾部取元素,实现了BlockingDeque接口。

在选择合适的工作队列时,需要考虑任务的性质、任务产生的速度、消费的速度以及资源的限制等因素。不同类型的队列对于不同的应用场景和需求有着不同的适应性。

最后更新于