首页 > 系统相关 >一个Java基于阻塞的定时消费内存队列

一个Java基于阻塞的定时消费内存队列

时间:2024-05-16 23:52:27浏览次数:15  
标签:value Java 队列 private int InsertQueueEnum 内存 final

 

@Getter
@AllArgsConstructor
public enum InsertQueueEnum {
  A(30000, 10, TimeUnit.SECONDS, 2, 1000),


  ;

  private final int capacity;//队列长度

  private final int time;//最长阻塞时间

  private final TimeUnit timeUnit;//最长阻塞时间单位

  private final int threads;//消费线程数

  private final int consumptionBatchNum;//单次消费数量


}

该方法在空闲时不会造成空转

@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class InsertQueue {
  //单例插入队列
  //枚举类型为所有队列类型

  private static final Map<InsertQueueEnum, ArrayBlockingQueue<Object>> TYPE_QUEUE_MAP = new EnumMap<>(InsertQueueEnum.class);

  static {
    for (InsertQueueEnum value : InsertQueueEnum.values()) {
      log.info("[" + InsertQueue.class.getSimpleName() + "]" + value + "队列长度" + value.getCapacity());
      TYPE_QUEUE_MAP.put(value, new ArrayBlockingQueue<>(value.getCapacity()));
    }
  }

  public static boolean pushObject(InsertQueueEnum type, Object obj) {
    try {
      TYPE_QUEUE_MAP.get(type).put(obj);
      return true;
    } catch (Exception e) {
      return false;
    }
  }

  public static <T> List<T> popObject(InsertQueueEnum type, int batchSize, long maxWaitTime, TimeUnit unit, Class<T> clazz) {
    //拿到batchSize个元素或超过maxWaitTime才返回,返回容器不会为空
    ArrayBlockingQueue<?> queue = TYPE_QUEUE_MAP.get(type);
    try {
      List<T> objects = new ArrayList<>();
      Object head = queue.take();//阻塞
      objects.add(clazz.cast(head));
      long startMillis = System.currentTimeMillis();
      long exitMillis = startMillis + unit.toMillis(maxWaitTime);
      for (int i = 1; i < batchSize && System.currentTimeMillis() <= exitMillis; i++) {
        head = queue.poll(maxWaitTime, unit);
        if (head == null) {
          break;
        }
        objects.add(clazz.cast(head));
      }
      return objects;
    } catch (Exception e) {
      log.error("[" + InsertQueue.class.getSimpleName() + "]" + type + "队列获取元素出错", e);
      return Collections.emptyList();
    }
  }

  public static int getQueueSize(InsertQueueEnum type) {
    return TYPE_QUEUE_MAP.get(type).size();
  }

}

 

标签:value,Java,队列,private,int,InsertQueueEnum,内存,final
From: https://www.cnblogs.com/JackieJK/p/18197016

相关文章

  • Java 网络编程(socket)
    概念:1.什么是网络编程?  计算机跟计算机之间通过网络进行数据传输。2.通信的软件架构C/S与B/S的区别?  C/S:客户端/服务端模式(需要开发客户端)  B/S:浏览器/服务端模式(不需要开发客户端)  网络编程三要素:1.IP     设备在网络中的地址,是唯一的标识2.......
  • hdu1176免费馅饼java
    一个数塔问题,以时间为纵坐标、位置为横坐标创建一个二维数组,然后从下往上相加。状态转移方程:9>=j>=1时dp[i][j]+=max(max(dp[i+1][j],dp[i+1][j+1]),dp[i+1][j-1])  j=0时 dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]) j=10时dp[i][j]+=......
  • Java-并发-ReentrantLock
    0.是什么ReentrantLock是java.util.concurrent.locks包中的一个类,提供了比synchronized关键字更灵活和强大的锁机制。ReentrantLock实现了Lock接口,它允许显式地加锁和解锁,并提供了一些高级功能,如中断锁请求、超时锁请求、公平锁和非公平锁选择等。1.为什么在Java诞生......
  • Java-线程-wait()、notify()和notifyAll()
    0.是什么(What)wait(),notify(),和notifyAll()方法都是Object类的一部分,用于实现线程间的协作。1.为什么(Why)线程的执行顺序是随机的(操作系统随机调度的,抢占式执行),但是有时候,我们希望的是它们能够顺序的执行。所以引入了这几个方法,使得我们能保证一定的顺序。1.1Objec类......
  • java复习
    Java复习好久没写博客了,主要是,忙着去干其他事去了。最近Java要考试了,打算梳理一下Java的知识点,主要是一些基础的语法,和Java的核心的常用的类库。ObjectObject类是Java中所有类的父类,因此有必要对该类中的方法进行了解,并记忆。Object类在java.lang中,常用方法如下:equals()......
  • java生成数字运算验证码
    第一步,引入依赖<!--验证码依赖--><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version></dependency> <!--算数验证码使用--><dependency><groupId>......
  • 容器内存可观测性新视角:WorkingSet 与 PageCache 监控
    作者:行疾、尝君、佑祎、六滔容器工作内存WorkingSet 概念介绍在Kubernetes场景,容器内存实时使用量统计(PodMemory),由WorkingSet工作内存(缩写WSS)来表示。WorkingSet这个指标概念,是由cadvisor为容器场景定义的。工作内存WorkingSet也是Kubernetes的调度决策判断内......
  • Java面试题:Spring中的循环依赖,给程序员带来的心理阴影
    循环依赖通常发生在两个或多个SpringBean之间,它们通过构造器、字段(使用@Autowired)或setter方法相互依赖,从而形成一个闭环。下面是一个使用字段注入(即使用@Autowired)导致的循环依赖的示例: 示例代码: 假设我们有两个类,ClassA和ClassB,它们相互依赖:publicclassClassA{......
  • JavaScript中执行上下文和执行栈是什么?
    一、执行上下文简单的来说,执行上下文是一种对Javascript代码执行环境的抽象概念,也就是说只要有Javascript代码运行,那么它就一定是运行在执行上下文中执行上下文的类型分为三种:全局执行上下文:只有一个,浏览器中的全局对象就是 window对象,this 指向这个全局对象函数执行上下......
  • RDLC降低使用内存
    在Winform使用RDLC时,在批量打印情况下,内存随着打印任务的数量逐渐增加。即便手动GC效果也不明显。原因:localReport在创建时,每个实例都是一个应用程序域。租约的过期时间比较久,按照网上的资料,过期时间大约10分钟左右。这就导致即便打印完了,内存也不会很快下降。解决办法:1.手......