生产者消费者 - ExecutorService 和 ArrayBlockingQueue

2024-01-01

我想知道我对使用 ExecutorService 和 ArrayBlockingQueue 的生产者消费者设计的理解是否正确。我知道有不同的方法来实现这个设计,但我想,最终,这取决于问题本身。

我必须面对的问题是:我有一个制作人,他从一个大文件(6GB)中读取;它逐行读取并将每一行转换为一个对象。它将对象放入 ArrayBlockingQueue 中。

消费者(少数)从 ArrayBlockingQueue 中获取对象并将其保存到数据库中。

现在,显然生产者比消费者快得多;将每一行转换为对象需要几分之一秒的时间,但对于消费者来说需要更长的时间。

所以...如果我希望通过这样做来加速这个过程:我创建了 2 个类“ProducerThread”和“ConsumerThread”,它们共享 ArrayBlockingQueue。两者之间协调的线程如下所示:

@Override
public void run()
{
    try{

        ArrayBlockingQueue<Ticket> queue = new ArrayBlockingQueue<Ticket>(40);
        ExecutorService threadPool = Executors.newFixedThreadPool(8);

        threadPool.execute(new SaleConsumerThread("NEW YORK", queue)); 
        threadPool.execute(new SaleConsumerThread("PARIS", queue));
        threadPool.execute(new SaleConsumerThread("TEL AVIV", queue));
        threadPool.execute(new SaleConsumerThread("HONG KONG", queue));
        threadPool.execute(new SaleConsumerThread("LONDON", queue));
        threadPool.execute(new SaleConsumerThread("BERLIN", queue));
        threadPool.execute(new SaleConsumerThread("AMSTERDAM", queue));

        Future producerStatus = threadPool.submit(new SaleProducerThread(progressBar, file, queue)); 
        producerStatus.get(); 
        threadPool.shutdown();   

    }catch(Exception exp)
    {
        exp.printStackTrace();
    }
}

我的问题是:

  1. 上面的设计实际上会使用每个线程吗同时?我的电脑是两个 2.4GHz 四核。

  2. 我不确定 Future 和 .get() 的用途是什么?

顺便说一句,结果很快(考虑到第一个版本是连续的,花了 3 小时),现在大约需要 40 分钟(但也许还有改进的空间)。

感谢您的任何指点


我会看看等待 IO 花费了多少时间以及 CPU 花费了多少时间。我怀疑您的主要瓶颈是数据库,您需要研究如何使导入更加高效。您可以尝试批量更新,因为这可以提高吞吐量。

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

生产者消费者 - ExecutorService 和 ArrayBlockingQueue 的相关文章

随机推荐

  • pandas 系列的循环移位

    我正在对 pandas 中的数据系列使用移位方法 文档 http pandas pydata org pandas docs stable generated pandas Series shift html 是否可以一步进行循环移位 即第
  • 如何使用Delphi2007运行非提升的进程

    我有一个类似安装程序的应用程序 我必须在 Vista 上以提升的身份运行它 但从那里我必须开始一个非提升的新流程 有什么提示如何使用 Delphi2007 做到这一点吗 我找到了一个C 的优秀示例 http www codeproject
  • 如何更改 Visual Studio Code 中的解释器?

    我在我的系统上安装了几个 Python 解释器 2 x 和 3 x 版本 我正在尝试准备我的工作环境 以便可以在用两个 Python 版本编写的代码之间轻松切换 在 Visual Studio Code VSC 中拥有尽可能灵活的设置非常重
  • 如何更改 Font Awesome 5 中图标的颜色?

    我无法使用这些代码为 Font Awesome 5 图标着色 我试过fillcss 属性用于设置颜色 但它不起作用 HTML 代码 div class container mt200 icons div class col md 3 div
  • SQL Server 中的函数与存储过程

    在 SQL 中什么时候应该使用函数而不是存储过程 反之亦然 每个的目的是什么 函数是计算值 不能执行永久的环境更改SQL Server 即 没有INSERT or UPDATE允许声明 函数可以内联使用SQL如果它返回标量值 则可以使用语句
  • Google Play 游戏应用中未显示成就

    我们根据官方谷歌开发文档为我们的 Android 游戏实现了 Google Play 成就 但似乎有些不对劲 因为我们注意到 Google Play 游戏应用程序中存在以下奇怪的行为 成就不会显示在 Google Play 游戏应用中 在
  • 计算三个加密数字的平均值

    是否可以计算三个加密整数的平均值 对加密方法没有限制 这样做的目的只是隐藏三个数字并求平均值 你似乎正在寻找的东西叫做同态加密 http en wikipedia org wiki Homomorphic encryption 一种加密方案
  • LibGDX FreeType 字体模糊

    我正在使用屏幕高度百分比和设置百分比动态生成字体 显然将来会乘以密度 一些笔记 我正在读取 OTF 文件 使用最新版本的LibGDX 版本1 2 0 我有以下问题 字体有很大的断裂 看起来很模糊 但仅限于medium Large and s
  • 如何在android中滚动tableview

    我有一个要滚动的表格视图 因为数据未显示完整
  • ggplot2 轴标签分组

    我正在尝试使用 ggplot2 构建一个图 在 X 轴上我可以找到某种为变量组添加标签的方法 这是我的代码的最小版本 Bzero lt 100 matrix runif 100 ncol 10 nrow 10 B lt 99 LNtype
  • 横向压平两列,雪花中不重复

    我有一个查询 该查询按两个变量进行分组以获得另一个变量的总数 为了维护我的表结构以供以后计算 我列出了另外两个变量以保存查询的下一阶段 但是 当我尝试稍后对 listagg 列进行两次展平时 我的数据会重复多次 示例 my table id
  • PyQt |信号不在 QThread 中处理,而是在主线程中处理

    在这个简单的 PyQt 演示程序中 我从主线程发出信号 在工作线程中 我连接到它们 但信号处理程序在主线程中运行 from PyQt4 import QtGui QtCore import threading from time impor
  • 使用没有 Surface View 的 Android 相机

    我正在android上开发 我想用相机做一些事情 处理像素的值 但只是在后台 是否可以在没有表面视图的情况下做到这一点 只需使用缓冲区读取像素值并进行处理 感谢每一位可以帮助我的人 从 API 级别 11 开始表面纹理 http devel
  • 哪些 GCC 优化标志和技术在 CPU 上是安全的?

    当编译 链接适用于 ISA 例如 x86 64 的所有实现的 C C 库或程序时 从正确性和运行时性能的角度来看 哪些优化标志是安全的 我希望优化能够产生正确的结果 并且不会对特定 CPU 的性能造成损害 例如 我希望避免优化标志 这些优化
  • SpannableStringBuilder 用正则表达式替换内容

    我有以下代码 我将在其中标记大括号之间的内容SpannableString并删除花括号 但它给出了错误的结果 String text the quic k brown fox jumps over the lazy dog A Quick
  • 嵌套参数无法编译

    我正在尝试将我的代码编译成 Python 3 模块 当我在 IDLE 中选择 运行模块 时它运行良好 但当我尝试创建发行版时收到以下语法错误 File usr local lib python3 2 dist packages simple
  • 生成 CrypoAPI (CAPI) 私钥

    我正在尝试使用静态加密IXml加密器 https learn microsoft com en us aspnet core security data protection extensibility key management vie
  • php 中未定义的函数 mysql_connect()

    我安装了 mysql installer web community 5 6 25 0 apache 2 4 2 x86 no ssl 和 php 5 4 42 Win32 VC9 x86 php 可以与 apache 服务器配合使用 但不
  • 如何增加 MDCTextInputControllerOutlinedTextArea 的高度

    I have assigned a class named MDCMultilineTextField for Uiview from the storyboard This class is used for Multiline Text
  • 生产者消费者 - ExecutorService 和 ArrayBlockingQueue

    我想知道我对使用 ExecutorService 和 ArrayBlockingQueue 的生产者消费者设计的理解是否正确 我知道有不同的方法来实现这个设计 但我想 最终 这取决于问题本身 我必须面对的问题是 我有一个制作人 他从一个大文