首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ThreadPoolExecutor中的LinkedBlockingQueue和PriorityBlockingQueue

ThreadPoolExecutor是Java中的一个线程池类,用于管理和调度线程的执行。它提供了一种方便的方式来执行并发任务,并且可以根据需要自动调整线程池的大小。

LinkedBlockingQueue和PriorityBlockingQueue是ThreadPoolExecutor中用于存储待执行任务的队列类型。

  1. LinkedBlockingQueue(链式阻塞队列):
    • 概念:LinkedBlockingQueue是一个基于链表实现的阻塞队列,它按照先进先出(FIFO)的顺序存储任务。
    • 分类:LinkedBlockingQueue是一个无界队列,即它可以存储任意数量的任务。
    • 优势:由于LinkedBlockingQueue是无界队列,所以它可以无限制地存储任务,适用于任务量较大的场景。
    • 应用场景:适用于任务量较大且任务执行时间较长的场景,可以有效地利用系统资源。
    • 腾讯云相关产品:腾讯云提供了消息队列CMQ(Cloud Message Queue)服务,可以用于实现类似的消息队列功能。具体产品介绍请参考:腾讯云消息队列 CMQ
  2. PriorityBlockingQueue(优先级阻塞队列):
    • 概念:PriorityBlockingQueue是一个基于优先级的阻塞队列,它可以根据任务的优先级进行排序。
    • 分类:PriorityBlockingQueue是一个无界队列,即它可以存储任意数量的任务。
    • 优势:PriorityBlockingQueue可以根据任务的优先级进行排序,保证高优先级的任务先被执行。
    • 应用场景:适用于需要根据任务优先级进行排序的场景,例如任务调度系统。
    • 腾讯云相关产品:腾讯云提供了弹性MapReduce(EMR)服务,可以用于大数据处理和分析,其中包含了任务调度和优先级管理的功能。具体产品介绍请参考:腾讯云弹性MapReduce(EMR)

以上是对ThreadPoolExecutor中的LinkedBlockingQueue和PriorityBlockingQueue的概念、分类、优势、应用场景以及腾讯云相关产品的介绍。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

还在用Executors创建线程池?小心内存溢出

(笔者注:阻塞队列均采用LinkedBlockingQueue) newCachedThreadPool newScheduledThreadPool: 主要问题是线程数最大数是Integer.MAX_VALUE...以上为《阿里巴巴java开发手册》原文 ---- ThreadPoolExecutor函数 Executors提供了四种创建线程池方法,实际上Executors底层也是调用了ThreadPoolExecutor...PriorityBlockingQueue: 一个支持优先级排序无界阻塞队列,对元素没有要求,可以实现Comparable接口也可以提供Comparator来对队列元素进行比较,跟时间没有任何关系...LinkedTransferQueue: 它是ConcurrentLinkedQueue、LinkedBlockingQueueSynchronousQueue结合体,但是把它用在ThreadPoolExecutor...LinkedBlockingQueue行为一致。

1.5K40

Java多线程系列--阻塞队列BlockingQueue用法

LinkedBlockingQueue 基于链表FIFO队列;有/无界;默认大小是 Integer.MAX_VALUE(无界),可自定义(有界); 两个重入锁分别控制元素入队出队,用Condition...ArrayBlockingQueue为有界队列: 任务12在核心线程执行; 任务34进来时,放到ArrayBlockingQueue缓存队列,并且只能放2个(ArrayBlockingQueue...设置大小为2); 任务56进来时候,任务5新建线程来执行任务,已经达到最大线程数3,所以任务6拒绝; 当有线程执行完时候,再将任务34从队列取出执行 创建线程池代码如下: /**...LinkedBlockingQueue 简介 LinkedBlockingQueueArrayBlockingQueue相同点: 是FIFO队列,不允许插入null值。...同样执行6个任务 核心线程执行任务12,其它任务3~6放到队列 执行完12,将34从队列取出执行 执行完34,将56从队列取出 创建线程池代码如下: /** * LinkedBlockingQueue

44330
  • 【深入浅出Java原理及实战】「并发编程系列」深入分析线程池工作原理(上篇)

    将任务运行逻辑提交到执行器Executor,由Executor框架完成线程调配任务执行部分。...ThreadPoolExecutor实现最复杂运行部分: 可以自动创建、管理复用指定数量一组线程,适用方只需提交任务即可线程安全,ThreadPoolExecutor内部有状态、核心线程数、非核心线程等属性...一般情况下用于非核心线程,只有在 ThreadPoolExecutor方法allowCoreThreadTimeOut(boolean value)设置为true时,也作用于核心线程。...corePoolSizemaximumPoolSize被设置为1,使用无界队列LinkedBlockingQueue作为线程池工作队列 newSingleThreadExecutor 创建是一个单线程池...LinkedBlockingQueue 无界任务队列:无界任务队列可以使用LinkedBlockingQueue实现,如下所示: new ThreadPoolExecutor(1, 2, 1000,

    36120

    JUC-线程池理解与学习

    提高线程管理性: 线程是稀缺资源,如果无限制创建,不仅会消耗系统资源还会降低系统稳定性,使用线程池可以进行统一分配、调优监控 线程池创建 线程池真正实现类是ThreadPoolExecutor...当最大线程数达到饱和时候需要执行饱和策略 任务队列 任务队列是基于阻塞队列实现,即采用生产者消费者模式,在Java需要实现BlockingQueue接口,但Java已经为我们提供了7种阻塞队列实现...Integer.MAX_VALUE PriorityBlockingQueue 一个支持优先级排序无界队列,对元素没有要求,可以实现Comparable接口来进行比较 DelayQueue 类似于...PriorityBlockingQueue,是二叉堆形成无界优先队列。...、打断所有线程、会将队列任务返回

    22130

    Android 四种常见线程池

    栗子:假如有一个新任务提交时,线程池中如果有空闲线程则立即使用空闲线程来处理任务,如果没有,则会把这个新任务存在一个任务队列,一旦有线程空闲了,则按FIFO方式处理任务队列任务。...3、SingleThreadExecutor() : 该方法返回一个只有一个线程线程池,即每次只能执行一个线程任务,多余任务会保存到一个任务队列,等待这一个线程空闲,当这个线程空闲了再按FIFO...方式顺序执行任务队列任务。...那么我们接下来就用PriorityBlockingQueue来实现一个FIFO线程池。...1)创建一个基于PriorityBlockingQueue线程池 ExecutorService priorityThreadPool = new ThreadPoolExecutor(3,3,0L,

    68780

    小米面试:如何实现优先级线程池?

    这就是开头我们一上来就讲线程工厂原因。 那在线程工厂如何设置线程优先级呢?...所以即使能在线程工厂设置线程优先级,那么也是将整个线程池中所有线程都设置成统一优先级了,而不能解决咱们本文提出问题,那如何才能实现优先级线程池呢?...此时我们想到,可以使用 PriorityBlockingQueue 优先级队列来对任务进行排序啊(PriorityBlockingQueue 天生支持按照优先级自动排序任务),这样不就能保证优先级高任务会被线程池优先获取并执行了嘛...: 从上述结果代码可以看出,我们添加任务顺序是:1、4、3、2,但最终会按照优先级排队执行顺序是:1、2、3、4,执行结果符合我们预期,优先级高任务先被执行了(数字越小,优先级越高)。...(数字越小优先级越高),如果将 compareTo 排序方法倒置之后,那么线程池执行顺序就完全相反了,可见使用 PriorityBlockingQueue 实现优先级线程池效果非常显著。

    8610

    小米面试:如何实现优先级线程池?

    这就是开头我们一上来就讲线程工厂原因。那在线程工厂如何设置线程优先级呢?...TimeUnit.MILLISECONDS, new LinkedBlockingQueue...所以即使能在线程工厂设置线程优先级,那么也是将整个线程池中所有线程都设置成统一优先级了,而不能解决咱们本文提出问题,那如何才能实现优先级线程池呢?...:从上述结果代码可以看出,我们添加任务顺序是:1、4、3、2,但最终会按照优先级排队执行顺序是:1、2、3、4,执行结果符合我们预期,优先级高任务先被执行了(数字越小,优先级越高)。...(数字越小优先级越高),如果将 compareTo 排序方法倒置之后,那么线程池执行顺序就完全相反了,可见使用 PriorityBlockingQueue 实现优先级线程池效果非常显著。

    6410

    常用阻塞队列 BlockingQueue 有哪些?

    为什么要使用阻塞队列 之前,介绍了一下 ThreadPoolExecutor 各参数含义(并发编程之线程池ThreadPoolExecutor),其中有一个 BlockingQueue,它是一个阻塞队列...file 2) LinkedBlockingQueue 这是一个由链表结构组成有界阻塞队列。它构造方法有三个。 ?...可以看到 ArrayBlockingQueue 构造方法大同小异,不过是,LinkedBlockingQueue 可以不指定队列大小,默认值是 Integer.MAX_VALUE 。...此外,LinkedBlockingQueue 实现了读写分离,可以实现数据写互不影响,这在高并发场景下,对于效率提高无疑是非常巨大。 ?...我理解是,这适用于并发任务不大,而且生产者消费者速度相差不多场景下,直接把生产者消费者对接,不用经过队列入队出队这一系列操作。所以,效率上会高一些。

    1.2K10

    Java多线程:还不懂线程池吗?一文带你彻底搞懂!

    线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会降低系统稳定性,使用线程池可以进行统一分配,调优监控。...PriorityBlockingQueue: 一个支持优先级排序无界阻塞队列,对元素没有要求,可以实现Comparable接口也可以提供Comparator来对队列元素进行比较。...LinkedTransferQueue: 它是ConcurrentLinkedQueue、LinkedBlockingQueueSynchronousQueue结合体,但是把它用在ThreadPoolExecutor...LinkedBlockingQueue行为一致,但是是无界阻塞队列。...其实Executors4个功能线程有如下弊端: FixedThreadPoolSingleThreadExecutor:主要问题是堆积请求处理队列均采用LinkedBlockingQueue,可能会耗费非常大内存

    62500

    Java线程池用过吧?来说说你是怎么理解线程池吧?

    这样就完成了线程资源复用了,全程只有一个线程在来回复用,一直在处理队列任务。 ? 通过上面的方式,实现了线程资源复用,并且也起到提交任务处理任务之间解耦。...这一版线程池,做到了在提交任务高峰时可临时扩容,低谷时又可及时回收非核心线程,从而节省资源。真正做到了收放自如。 通过上面几版线程池改进,最终改进成了Java线程池原理基本相似了。...PriorityBlockingQueue:优先级排序队列,按照一定优先级对任务进行排序,默认是小顶堆。 LinkedBlockingDeque:基于链表双端阻塞队列。...参数传入是一个线程并发数量,这里之前就有很明显区别,前面4种线程池都有核心线程数、最大线程数等等,而这就使用了一个并发线程数解决问题。...优先级队列,将会导致优先级最高任务被抛弃,所以在阻塞队列为PriorityBlockingQueue时,不建议使用此策略。

    50030

    面试官:使用无界队列线程池会导致内存飙升吗?

    无限加入队列 具体细节说明文章:Java线程池Executor详解 本文以Executors.newFixedThreadPool为例 定长线程池,核心线程数最大线程数由用户传入,超出在队列等待...* unit : 秒 * workQueue : LinkedBlockingQueue **/ return new ThreadPoolExecutor...()); } newFixedThreadPoolSingleThreadExecutor类似,唯一区别就是核心线程数不同,并且由于使用LinkedBlockingQueue...LinkedBlockingQueue默认最大任务数量是Integer.MAX_VALUE,非常大,可以理解为无限大吧;但是存在这种情况,当每个线程获取到一个任务后,执行时间比较长,导致workQueue...jdk7提供了7个阻塞队列,分别是: ArrayBlockingQueue:一个由数组结构组成有界阻塞队列 LinkedBlockingQueue:一个由链表结构组成有界阻塞队列 PriorityBlockingQueue

    73710

    Java--线程池

    Java中提供了一系列锁相关工具:synchronized、ReentrantLock、AtomicXXX类,它们都能帮助解决我们进行多线程操作时并发问题,之前我们也提到了内核线程模型,Hotspot...1.ThreadPoolExecutor执行任务图解 Executors是个帮助类,内部实际使用ThreadPoolExecutor,构造函数如下: public ThreadPoolExecutor...大致执行场景如下: execute方法执行流程 2.ThreadPoolExecutor参数 再来看构造函数各个参数含义: corePoolSize:核心线程最大数,当有新任务时,如果小于该值,...PriorityBlockingQueue: 一个具有优先级无限阻塞队列。 4.拒绝策略 DiscardPolicy:丢弃当前将要加入队列任务本身。...())); } 它仅有一个核心线程,以及一个无限大小任务队列,所以相当于单线程执行任务队列任务

    33230

    Java线程池

    任务不需要等待线程创建就可以立即执行 提高线程可管理性。线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会降低系统稳定性,使用线程池可以进行统一管理分配、调优监控。...线程数大于或等于corePoolSize时,将任务加到BlockingQueue (3)当任务无法加到BlockingQueue(队列已满)时,创建新线程执行任务 (4)当创建新线程使当前线程数大于...常用队列有: (1)ArrayBlockingQueue:基于数组结构有界阻塞队列,按照FIFO(先进先出)原则对元素进行排序,最大值为 Integer.MAX_VALUE (2)LinkedBlockingQueue...吞吐量一般高于LinkedBlockingQueue。...(4)PriorityBlockingQueue:一个具有优先级无界阻塞队列 maninumPoolSize(线程池最大线程数):线程池允许创建最大线程数。

    35410

    知道了以上内容,结合上面表格方法,ArrayBlockingQueue 就可以轻松过关了 ? 和数组相对自然是链表了 LinkedBlockingQueue ?...LinkedBlockingQueue 也算是一个有界阻塞队列 ,从下面的构造函数你也可以看出,该队列默认最大长度为 Integer.MAX_VALUE ,这也就 docs 说 optionally-bounded...但是在一些并发程序,数组形式队列由于具有一定可预测性,因此可以在某些场景获得更高效率 看到 LinkedBlockingQueue 是不是也有些熟悉呢?为什么要使用线程池?...因为单线程池固定线程池中,线程数量是有限,因此提交任务需要在LinkedBlockingQueue队列中等待空余线程; 而缓存线程池中,线程数量几乎无限(上限为Integer.MAX_VALUE...),因此提交任务只需要在SynchronousQueue 队列同步移交给空余线程即可, 所以有时也会说 SynchronousQueue 吞吐量要高于 LinkedBlockingQueue

    57910

    Java并发编程之线程池

    常用阻塞队列有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue等。...在ThreadPoolExecutor定义了四个内部类,分别表示四种拒绝策略。我们也可以通过实现RejectExecutionHandler接口来实现自定义拒绝策略。...dubbo线程池继承了ThreadPoolExecutor.AbortPolicy,重写了rejectedExecution方法,并且dubbo线程模型所有拒绝策略都是使用AbortPolicyWithReport...,将会放入队列,因为LinkedBlockingQueue是长度为Integer.MAX_VALUE队列,可以认为是无界队列,因此往队列可以插入无限多任务,在资源有限时候容易引起OOM异常,因为无界队列...SingleThreadExecutor类似,唯一区别就是核心线程数不同, * 并且由于使用LinkedBlockingQueue,在资源有限时候容易引起OOM异常 */

    39300
    领券