ExecutorService,避免任务队列太满的标准方法

2023-12-27

我在用ExecutorService为了方便并发多线程程序。采取以下代码:

while(xxx) {
    ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS);
    ...  
    Future<..> ... = exService.submit(..);
    ...
}

就我而言,问题是submit()如果全部都没有阻塞NUMBER_THREADS被占用。结果是任务队列被许多任务淹没。这样做的结果是,关闭执行服务ExecutorService.shutdown()需要很长时间(ExecutorService.isTerminated()长时间内将是错误的)。原因是任务队列仍然很满。

现在我的解决方法是使用信号量来禁止任务队列中有太多条目ExecutorService:

...
Semaphore semaphore=new Semaphore(NUMBER_THREADS);

while(xxx) {
    ExecutorService exService = Executors.newFixedThreadPool(NUMBER_THREADS); 
    ...
    semaphore.aquire();  
    // internally the task calls a finish callback, which invokes semaphore.release()
    // -> now another task is added to queue
    Future<..> ... = exService.submit(..); 
    ...
}

我确信有更好的封装解决方案吗?


诀窍是使用固定的队列大小并且:

new ThreadPoolExecutor.CallerRunsPolicy()

我还推荐使用番石榴监听执行服务 https://github.com/google/guava/wiki/ListenableFutureExplained。 这是消费者/生产者队列的示例。

private ListeningExecutorService producerExecutorService = MoreExecutors.listeningDecorator(newFixedThreadPoolWithQueueSize(5, 20));
private ListeningExecutorService consumerExecutorService = MoreExecutors.listeningDecorator(newFixedThreadPoolWithQueueSize(5, 20));

private static ExecutorService newFixedThreadPoolWithQueueSize(int nThreads, int queueSize) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  5000L, TimeUnit.MILLISECONDS,
                                  new ArrayBlockingQueue<Runnable>(queueSize, true), new ThreadPoolExecutor.CallerRunsPolicy());
}

如果有更好的,您可能需要考虑像 RabbitMQ 或 ActiveMQ 这样的 MQ,因为它们具有 QoS 技术。

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

ExecutorService,避免任务队列太满的标准方法 的相关文章

随机推荐

  • Laggy Lazy Column Android Compose

    我已经创建了一个完整的应用程序Jetpack 组合 然而 现场的表演Lazy Column非常糟糕 而且没有任何意义 Lazy Column应该是替代RecyclerView but RecyclerView目前效果好多了 我制造了一个La
  • 测量 flutter 应用程序启动时间

    我正在寻找某种方法来测量应用程序的启动时间 从单击应用程序图标的那一刻直到用户可以看到登录页面的那一刻 Run flutter run trace startup profile 跟踪输出保存为名为的 JSON 文件start up inf
  • 如何使用 monodroid 将应用程序添加到“共享”菜单

    我的解决方案基于这篇文章 http twigstechtips blogspot com 2011 10 android sharing images or files through html http twigstechtips blo
  • 字体粗细

    我正在使用购买字体 Museo Sans 作为我正在开发的应用程序中的自定义字体 我购买时给我的文件包含不同粗细的网络字体文件 MuseoSans100Regular MuseoSans300Regular 等 font face 中有没有
  • 链接到没有锚标记的网页上的任意内容

    我正在寻找一种方法来链接到网页上特定范围的单词 图像或其他任意内容 一种替代方法是在页面上引入大量锚点 但我可以接受需要 JavaScript 的解决方案 最好也是突出目标内容的一种 如果页面内容已被修改并且链接不再有效 那么最好有某种保护
  • 污染 $scope 对象会影响性能吗?

    我有一个控制器 其中 scope 对象用于存储仅在同一控制器中本地使用的方法和值 有很多这样的事情正在发生 scope foo something scope bar something else 等等 这些值均未在视图中使用 我的问题是污
  • 在 Bash 中以字符串形式执行命令

    我正在测试一个简短的 bash 脚本 我想将字符串作为命令执行 bin bash echo AVR GCC elf main elf c main c gcc avr gcc mmcu atmega128 Wall Os o elf c e
  • aspx页面中的变量范围

    这是为什么scriptPath变量是超出范围在代码的底部 它不应该在整个页面的范围内吗 在 MVC 中 如果我将其标记在页面顶部 例如 string scriptPath assets scripts gkoConfig GkoConfig
  • 如何更改 p:barChart yaxis-tick 颜色

    如何更改 barChart yaxis tick 颜色 jqplot axis jqplot yaxis jqplot yaxis tick color green 我尝试了我能找到的任何选项 也使用 Firebug 但没有任何效果 任何想
  • HTML/JavaScript UI 小部件 GUI 构建器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python Pandas 如何将 groupby 操作结果分配回父数据帧中的列?

    我在 IPython 中有以下数据框 其中每一行都是一只股票 In 261 bdata Out 261
  • jQuery:按类和输入类型选择

    我想使用 jQuery 选择一组既具有特定输入类型 例如复选框 又具有特定类的元素 但是 当我尝试以下操作时 input checkbox myClass 我没有收到任何退回的物品 我怎样才能在 jQuery 中完成这个任务 您的选择器正在
  • 在聚合框架 C# 中使用 Facet

    我想对我的数据创建一个聚合 以获取 Net 应用程序中书籍集合的特定标签的总计数 我有以下书籍课程 public class Book public string Id get set public string Name get set
  • 带向量极限的四边形

    我想使用quad作为限制列表没有 for 循环 作为一个基本示例 T 1 2 3 f x x 2 quad 0 T 1 f 计算我需要的内容 但我想将quad 0 T 1 f quad 0 T 2 f quad 0 T 3 f 保存为向量
  • 在本机反应中更新/更改状态对象的最佳方法?

    更新 State 对象深处的嵌套属性的最佳方法是什么 constructor this state someprop quadrangle rectangle width 我想更新矩形对象的宽度 this state quadrangle
  • Xcode 没有嵌入框架部分

    我有问题 我正在尝试在我的 ios xcode 项目中实现 Amazon 框架 并且我还需要将它们添加到 构建阶段 gt 嵌入框架 部分中 但我的 xcode 窗口中没有选项 这是截图 这怎么可能 即使我创建新项目 问题仍然存在 您好 在您
  • 与内联块未对齐(其他元素被推下)

    我正在尝试将小盒子排成一行 这些盒子每个里面有大约 2 个元素 在某些情况下 第一个元素的文本太多 以至于它分成两行 如果发生这种情况 该特殊行中的所有其他块如下所示 长话短说 这是一个例子 http jsfiddle net PMRQ5
  • 如何在 JOptionPane 的 ok 按钮上添加监听器? [复制]

    这个问题在这里已经有答案了 如何在单击 确定 按钮时添加侦听器JOptionPane INFORMATION MESSAGE 我的 JOptionPane 是 JOptionPane showMessageDialog null Your
  • Xbox One 控制器输入到 UWP 应用程序

    我一直在尝试使 Xbox One 控制器与 UWP 应用程序交互 并研究了 Gamepad 类 基于评论中提到的建议 Windows UWP 中对 Xbox One 的控制器支持 https stackoverflow com questi
  • ExecutorService,避免任务队列太满的标准方法

    我在用ExecutorService为了方便并发多线程程序 采取以下代码 while xxx ExecutorService exService Executors newFixedThreadPool NUMBER THREADS Fut