netty 无阻塞队列 MpscArrayQueue,一个字就是快

2023-11-16

netty提供了高效的线程安全的队列 MpscArrayQueue ,一个字快,至于快的原因可以去查看相关的文章,内存的伪共享先关的内容.

import static java.lang.Thread.sleep;
import io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueue;
import java.util.ArrayList;
import java.util.List;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
 
/**
 * 日志服务
 *
 * @author wyzhang
 * @date 2021/1/11 16:09
 */
@Slf4j
@Service
public class LogService<T> {
  MpscArrayQueue<T> mpscArrayQueue = new MpscArrayQueue(10000);
 
  @SneakyThrows
  public void addLog(T content) {
    boolean offer = mpscArrayQueue.offer(content);
    if (!offer) {
      log.info("写入日志失败{}", content);
      sleep(1);
    }
  }
 
  public List<T> drain() {
    List<T> list = new ArrayList<>();
    mpscArrayQueue.drain(
        (e) -> {
          list.add(e);
        },
        100);
    return list;
  }
}

测试代码

  @Test
  public void testMpsQueue() throws InterruptedException {
    final LogService<String> logService = new LogService();
    AtomicInteger atomicInteger = new AtomicInteger(0);
    Runnable supplier =
        new Runnable() {
          @SneakyThrows
          @Override
          public void run() {
            while (true) {
              String content= "data is " + atomicInteger.incrementAndGet();
//              log.info("写入数据 {}" , content);
              logService.addLog(content);
              sleep(1);
            }
 
          }
        };
    Thread t1 = new Thread(supplier);
    t1.start();
 
    Thread t2 = new Thread(supplier);
    t2.start();
    new Thread(
            () -> {
              while (true) {
                List<String> list = logService.drain();
                log.info(" data length is {} data  is {}", list.size(), list);
                if (CollectionUtils.isEmpty(list)) {
                  try {
                    sleep(1);
                  } catch (InterruptedException e) {
                    e.printStackTrace();
                  }
                }
              }
            })
        .start();
    while (true) {
      sleep(1000);
      t1.stop();
      t2.stop();
      sleep(20);
      break;
    }
  }

https://blog.csdn.net/w329636271/article/details/112479482

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

netty 无阻塞队列 MpscArrayQueue,一个字就是快 的相关文章

  • 如何编写 Hibernate HQL 查询来删除所有“孙子”元素?

    我有学校 里面有团体 里面有学生 我想删除特定学校的所有学生 在 SQL 中我可以编写以下查询 DELETE FROM students1 WHERE students1 group id IN SELECT id FROM group1
  • 何时/为何使用/定义接口[重复]

    这个问题在这里已经有答案了 可能的重复 何时最好使用 java 中的接口 https stackoverflow com questions 2586389 when best to use an interface in java Hi
  • 如何让Spring RabbitMQ创建一个新的队列?

    根据我对rabbit mq的 有限 经验 如果您为尚不存在的队列创建新的侦听器 则会自动创建该队列 我正在尝试将 Spring AMQP 项目与rabbit mq 一起使用来设置侦听器 但出现错误 这是我的 xml 配置
  • 线程“main”java.lang.UnsatisfiedLinkError中出现异常:java.library.path中没有opencv_java249

    我目前正在尝试在我的 32 位笔记本电脑上设置 OpenCV 但我不断收到一条令我困惑的错误消息 Exception in thread main java lang UnsatisfiedLinkError no opencv java2
  • 使用 Spring Data REST 处理自定义异常 (i18n)

    我正在使用 Spring Boot 1 5 4 和 Spring JPA Spring Data REST HATEOAS 我正在寻找一种最佳实践 Spring 方式 来自定义异常 Spring Data REST 正在管理添加 i18n
  • 使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃

    好吧 这可能不太可能 但还是这样吧 在Java JRE 1 6 0 26 b03 中我有两个类 SuperControl及其子类SubControl 它们都需要是持久对象 我正在使用 Hibernate Annotations 来实现这一点
  • RSA SignatureException:签名长度不正确

    我在签署 rsa 签名时遇到问题 我有一个用私钥加密的签名 然而 当我尝试使用公钥验证它时遇到问题 我得到以下异常 java security SignatureException Signature length not correct
  • 正确使用 JDBC 连接池 (Glassfish)

    我需要在 Java Web 服务中作为会话 bean 实现数据库连接 但我不确定我这样做是否正确 我创建了一个类 public final class SQLUtils private static DataSource m ds null
  • 尝试在java中的Arraylist中查找对象的所有出现

    我有一个 Java ArrayList 我需要查找其中出现的所有特定对象 ArrayList indexOf Object 方法只找到一次出现 所以看来我还需要其他东西 我认为你不需要太花哨 以下应该可以正常工作 static
  • BlackBerry SQLite:将一个 SQLite 数据库连接到另一个

    我正在尝试使用 SQLite 将一个 SQLite 数据库附加到 BlackBerry 上的另一个数据库附加数据库 http www sqlite org lang attach html命令 Database d1 d2 Statemen
  • 如何制作无限的jscrollpane?

    我之前已经实现过拖动滚动 但是创建无限滚动窗格的最佳方法是什么 当然不会有任何滚动条 我将实现拖动滚动 我想做的是在无限表面上实现动态加载 EDIT 当然 它实际上不会是无限的 我想问如何伪造它 您可以执行以下操作 AdjustmentCl
  • 打印 jasper 文件时执行报表 SQL 语句时出错

    我修改了一个旧项目 但无法确定这段代码有什么问题 使用下面的 jrxml它创造 jasper文件 当我打印 jasper 文件时 使用此代码JasperPrint jasperPrint JasperFillManager fillRepo
  • 如何从 Google Custom Search API 获取超过 100 个结果

    我正在尝试使用 Google Custom Search API 在 Java 中进行研究 因此 我需要为每个查询提供一个大的结果集 然而 我似乎仅限于前 100 个结果 这比我需要的要少得多 我使用这样的列表方法 list setStar
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • 我们可以有虚假中断吗?

    我正在创建一个任务轮询器 每分钟都会查找任务 它看起来像这样 public class Poller private final ExecutorService e Executors newSingleThreadExecutor pub
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • Selenium - 等待网络流量

    我们将 Selenium 与 Java API 和一些 Javascript 用户扩展一起使用 我们在应用程序中使用了大量 AJAX 调用 我们的许多测试随机失败 因为有时 AJAX 调用完成得比其他时候慢 因此页面未完全加载 我们通过等待
  • 编写自定义 Eclipse 调试器

    EDIT 一定有某种方法可以解决这个问题 而无需编写全新的调试器 我目前正在研究在现有 java 调试器之上构建的方法 如果有人对如何获取 Java 调试器已有的信息 有关堆栈帧 变量 原始数据等 有任何想法 那将非常有帮助 我想要做的是我
  • Integer.parseInt 引发的 NumberFormatException

    嘿 我在学校上编码课 但老师没有很好地解释 所以我们必须在网上查找我所做的信息 但我无法找到代码中的错误 你能帮我吗 char end s do System out println Tipo de boleto char boleto c

随机推荐

  • ES使用小结

    ES使用总结 1 查询es全部索 2 根据es索引查询文档 3 查看指定索引mapping文件 4 默认查询总数10000条 5 删除指定索引文档 6 删除所有数据包括索引 7 設置窗口值 8 logstash简单配置 Logstash配置
  • 高德地图Amap常用功能总结

    设置缩放比例 1 设置缩放比例的api是 aMap moveCamera CameraUpdateFactory zoomTo 18 如果你直接设置是没用的 因为此时地图还没加载成功 所以要监听地图加载成功的事件 aMap setOnMap
  • MATLAB中均值、方差、均方差的计算方法

    1 均值 数学定义 Matlab函数 mean gt gt X 1 2 3 gt gt mean X 2 如果X是一个矩阵 则其均值是一个向量组 mean X 1 为列向量的均值 mean X 2 为行向量的均值 gt gt X 1 2 3
  • sql查询按两个字段查询重复记录

    1 sql查询按两个字段查询重复记录 代码如下 示例 select from 表名 a where a 字段1 in select 字段1 from 表名 group by 字段1 字段2 having count gt 1 and a 字
  • STM32通过ESP8266利用机智云平台实现手机远程操作

    STM32通过ESP8266利用机智云平台实现手机远程操作 将STM32作为主控芯片 ESP8266作为外设 利用串口传递信息 通过机智云平台实现STM32与手机之间的数据传输 之所以选择机智云平台 是因为机智云平台相关配套的软件工具非常齐
  • 【每日一题】Leetcode 刷题 二叉树-树的遍历 介绍

    二叉树 树的遍历 前序遍历 根 左 右 中序遍历 左 根 右 后序遍历 左 右 根 代码实现 前序遍历 中序遍历 后序遍历 完整代码 前序遍历 根 左 右 遍历顺序分别为 F B A D C E G I H 中序遍历 左 根 右 中序遍历顺
  • 常见的 HTML<meta> 标签的 name 属性及其作用

    HTML中的 标签可以通过 name 属性提供元数据 这些元数据可以用于指定有关文档的信息 以及控制浏览器和搜索引擎的行为 name 属性通常与其他属性一起使用 如 content charset http equiv 等 以提供更具体的元
  • 2022国赛34:路由器之间ISIS协议配置

    大赛试题内容 5 RT1以太链路 RT2以太链路之间运行ISIS协议 进程10 分别实现loopback3 之间ipv4互通和ipv6互通 RT1 RT2的NET分别为10 0000 0000 0001 00 10 0000 0000 00
  • web基础学习(十)CSS3之 @keyframes 、animation

    css3新增属性 keyframes 关键帧 可以帮助开发者不必依赖JavaScript 只使用css代码完成动画制作 那么如何使用 keyframes呢 这里有两个重要知识点 1 keyframes 定义关键帧 语法 keyframes
  • 低功耗技术——流水线设计(加法器和乘法器)

    文章目录 前言 一 流水线 1 16bit加法器 2 无符号4bit乘法器 3 编写一个4bit乘法器模块 并例化该乘法器求解c 12 a 5 b 二 降低FPGA功耗 1 静态功耗 2 动态功耗 前言 2023 3 31 今天学习降低功耗
  • Python——shutil模块

    os模块不仅提供了新建文件 删除文件 查看文件属性的操作功能 还提供了对文件路径的操作功能 但是 对于移动 复制 打包 压缩 解压文件及文件夹等操作 os模块没有提供相关的函数 此时需要用到shutil模块 shutil模块是对os模块中文
  • 秋招-数据结构-链表篇

    秋招 数据结构 链表篇 介绍 链表是一种物理存储单元上非连续 非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表由一系列结点 链表中每一个元素称为结点 组成 结点可以在运行时动态生成 每个结点包括两个部分 一个是存储
  • Java 与 区块链技术_java区块链技术有哪些主要的特点和应用

    java区块链技术有哪些主要的特点是什么 人们对于区块链技术比较熟悉 但是却并不知道它到底有哪一些概念 java区块链技术有哪些人有接触过呢 有很多人都会觉得区块链技术就好像是我们最初所认识的互联网一样 要想有效解决陌生人之间的信任问题 首
  • Android零基础—环境搭建

    转载原文 http blog csdn net tangjie134 article details 79481581 1 Android Studio 3 0和SDK获取 方式1 进入 Android Developers官方网站下载 方
  • 在Linux命令行终端中写python代码的简单操作

    Linux终端中的操作均是使用命令行来进行的 因此 对于小白来说 熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来 打开命令行窗口 打开命令行窗口的快捷键如下 Ctrl Alt t 关闭名命令行窗口 关闭
  • 华为消费者算法岗一面二面

    不吹不黑 u1s1 华为是我面的几家公司里面一面二面相对简单的 没怎么问基础知识 对项目的探讨会更多一点 所以其实也看个人 如果有的小伙伴对项目不是很熟 对基础知识比较熟可能会觉得有点难 一面 逐个介绍简历里的项目 然后自己挑一个进行详细介
  • 在外包公司熬了 3 年终于进了字节,竭尽全力....

    其实两年前校招的时候就往字节投了一次简历 结果很明显凉了 随后这个理想就被暂时放下了 但是这个种子一直埋在心里这两年除了工作以外 也会坚持写博客 也因此结识了很多优秀的小伙伴 从他们身上学到了特别多东西 把这次面试分享出来 也是希望可以帮助
  • C语言:函数指针和指针函数学习

    一 指针函数 定义 指针函数就是返回值类型是指针的函数 后面说的是本身是什么 前面说的是返回值类型是什么 声明方法 类型标识符 函数名 参数列表 int fun int x int y int fun int x int y int fun
  • 使用C++来创建界面

    上节讲到 Qt 支持两种创建界面的方式 一种是使用C 代码 Qt 自诞生以来就支持 另一种是使用 QML 可以创建个性化的界面 Qt 提供了多种工程类型 选择不同的工程类型将导致使用不同的方式来创建界面 本节先讲解C 的使用 首次打开Qt
  • netty 无阻塞队列 MpscArrayQueue,一个字就是快

    netty提供了高效的线程安全的队列 MpscArrayQueue 一个字快 至于快的原因可以去查看相关的文章 内存的伪共享先关的内容 import static java lang Thread sleep import io netty