首页 > 其他分享 >workQueue

workQueue

时间:2024-01-28 12:22:50浏览次数:17  
标签:队列 元素 LinkedBlockingQueue 阻塞 线程 workQueue

线程池参数的 workQueue 决定了缓存任务的排队策略,对于不同的业务场景,我们可以使用不同的排队策略。

我们只需要实现BlockingQueue 这个接口即可。

介绍一下常用的有三种workQueue。

1. SynchronousQueue

SynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者(即丢给空闲的线程去执行),必须等队列中的添加元素被消费后才能继续添加新的元素,否则会走拒绝策略,所以使用SynchronousQueue阻塞队列一般要求maximumPoolSizes为无界,避免线程拒绝执行操作。

插入元素到队列的线程被阻塞,直到另一个线程从队列中获取了队列中存储的元素。同样,如果线程尝试获取元素并且当前不存在任何元素,则该线程将被阻塞,直到线程将元素插入队列。

2. LinkedBlockingQueue

LinkedBlockingQueue如果不指定大小,默认值是 Integer.MAX_VALUE

源码在此:

public LinkedBlockingQueue() {
  this(Integer.MAX_VALUE);
}
@Native public static final int MAX_VALUE = 0x7fffffff;

就是说这个队列里面可以放 2^31-1 = 2147483647 个 任务,也就是无界队列。

所以为了避免队列过大造成机器负载或者内存爆满的情况出现,我们在使用的时候建议手动传一个队列的大小。

与ArrayBlockingQueue不同的是,LinkedBlockingQueue内部分别使用了takeLock 和 putLock 对并发进行控制,也就是说,添加和删除操作并不是互斥操作,可以同时进行,这样也就可以大大提高吞吐量。

与之类似的是 LinkedBlockingDeque。

LinkedBlockingDeque: 使用双向队列实现的双端阻塞队列,双端意味着可以像普通队列一样FIFO(先进先出),可以像栈一样FILO(先进后出)

3. DelayQueue

DelayQueue是一个延迟队列,无界,队列中每个元素都有过期时间,当从队列获取元素时,只有过期元素才会出队列,而队列头部的元素是过期最快的元素。

能够准确的把握任务的执行时间,通常可以使用在:

1、定时任务调度,比如订单过期未支付自动取消

2、缓存

标签:队列,元素,LinkedBlockingQueue,阻塞,线程,workQueue
From: https://www.cnblogs.com/zhengbiyu/p/17992710

相关文章

  • Workqueue (翻译 by chatgpt)
    原文:https://www.kernel.org/doc/html/latest/core-api/workqueue.htmlIntroductionTherearemanycaseswhereanasynchronousprocessexecutioncontextisneededandtheworkqueue(wq)APIisthemostcommonlyusedmechanismforsuchcases.有许多情况需要异步处......
  • WorkQueue
    Workqueues,也被称为(Taskqueues),任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。 当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。此时就可以使用work模型,多个消费者共同处理消......
  • SpringAMQP-WorkQueue模型
          ......
  • workqueue、tasklet
      Linux内核中断处理“下半部”机制(上)(超详细~)-知乎(zhihu.com)  内核把中断处理分为两部分:上半部(top-half)和下半部(bottom-half),上半部(就是中断服务程序)内核立即执行,而下半部(就是一些内核函数)留着稍后处理。首先:一个快速的“上半部”来处理硬件发出的请求,它......
  • 设备驱动-10.中断子系统-4.2中断线程化处理-workqueue
    1工作队列workqueue引入定时器、tasklet,它们都是在中断上下文中执行,它们无法休眠。那么如果一旦中断要处理耗时复杂的操作,就会显得很卡。那么使用内核线程来处理这些耗时的工作,那就可以解决系统卡顿的问题。Linux内核中工作队列workqueue就是线程化处理的一种方式,“工作队列”(......
  • 2023.7.16 linux 软中断Softirqs 队列 Workqueues 并发管理队列cmwq
    Implementingwork-deferringmechanisms 延期任务Softirqs:Executedinanatomiccontext # kernel/softirq.c ;<linux/interrupt.h>.Tasklets:Executedinanatomiccontext Workqueues:Executedinaprocesscontext structsoftirq......
  • Kubernetes编程——client-go基础—— 工作队列(workqueue)
    工作队列(workqueue[wɜːk][kjuː])https://github.com/kubernetes/kubernetes/tree/release-1.27/staging/src/k8s.io/client-go/util/workqueue我理解意思是说:这里说的"工作队列"指的一个数据结构。用户可以按照队列所预定义的顺序向这个队列中添加和取出......
  • 12 workqueue
    代码编程指南构造workqueue将workqueue放入队列,开始调度1工作机制内核线程(while(1))中对去判定是否存在workqueue;如果不存在择休眠;如果存在workqueue则等待wakeup事......
  • WorkQueue
    工作队列(WorkQueue)在控制器编写中使用得非常频繁,通常使用informer.AddEventHandler函数监听资源对象的事件,并设置事件触发时的回调函数。在回调函数中,将资源对象的key放入W......
  • Java并发编程——ForkJoinPool之WorkQueue
    一、ForkJoinPoolForkJoinPool是JDK7引入的,由DougLea编写的高性能线程池。核心思想是将大的任务拆分成多个小任务(即fork),然后在将多个小任务处理汇总到一个结果上(即jo......