我应该使用 Java 中的哪个线程池?

2024-02-06

有大量的任务。 每个任务都属于一个组。要求是每组任务应该像在单线程中执行一样串行执行,并且在多核(或多CPU)环境中吞吐量应该最大化。注意:组的数量也与任务数量成正比。

最简单的解决方案是使用 ThreadPoolExecutor 并同步(或锁定)。然而,线程会互相阻塞并且吞吐量没有最大化。

还有更好的主意吗?或者是否存在满足要求的第三方库?


一种简单的方法是将所有组任务“连接”成一个超级任务,从而使子任务串行运行。但这可能会导致其他组延迟,除非其他组完全完成并在线程池中腾出一些空间,否则这些组不会启动。

作为替代方案,请考虑链接小组的任务。下面的代码说明了这一点:

public class MultiSerialExecutor {
    private final ExecutorService executor;

    public MultiSerialExecutor(int maxNumThreads) {
        executor = Executors.newFixedThreadPool(maxNumThreads);
    }

    public void addTaskSequence(List<Runnable> tasks) {
        executor.execute(new TaskChain(tasks));
    }

    private void shutdown() {
        executor.shutdown();
    }

    private class TaskChain implements Runnable {
        private List<Runnable> seq;
        private int ind;

        public TaskChain(List<Runnable> seq) {
            this.seq = seq;
        }

        @Override
        public void run() {
            seq.get(ind++).run(); //NOTE: No special error handling
            if (ind < seq.size())
                executor.execute(this);
        }       
    }

优点是不使用额外的资源(线程/队列),并且任务的粒度比简单方法中的更好。缺点是所有小组的任务都应该提前知道.

--edit--

为了使这个解决方案通用且完整,您可能需要决定错误处理(即,即使发生错误,链是否继续),并且实现 ExecutorService 并将所有调用委托给底层执行器也是一个好主意。

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

我应该使用 Java 中的哪个线程池? 的相关文章

随机推荐

  • 如何处理极长的LSTM序列长度?

    我有一些数据以非常高的速率 大约每秒数百次 采样 对于任何给定实例 这会导致平均序列长度很大 约 90 000 个样本 整个序列有一个标签 我正在尝试使用 LSTM 神经网络将新序列分类为这些标签之一 多类分类 然而 使用具有如此大序列长度
  • 如何更改浮动占位符的角度材料表单字段中的字体大小

    下面是角材料的形状场 当占位符正常和浮动时 如何为占位符添加 2 个不同的自定义字体大小 字体大小 20px 正常时 字体大小 13px 当它浮起来并变小时
  • 推送路线时将对象作为 prop 传递

    该功能位于路由器视图之外的组件中 goToMarkets this router push path markets params stock this model 但该道具在 市场 组件中未定义 Router const routes p
  • 如何使用 es6 js 类表示法自动递增 id 值?

    我在 es6 中的类方面遇到一些问题 每次创建对象时 我都需要自动递增 id 值 真的不明白我如何声明变量 为 id 赋值 然后递增增量变量 class Rectangle constructor name width height x y
  • 将报告导出为 PDF 时更改字体

    我在用着贾斯珀软件工作室 5 2 我做了一份报告快递新字体 当我将其导出到 PDF 时 它会将字体更改为Arial 我只使用Studio工具 当我预览报告时一切正常 但当我导出时就会发生这种情况 我可以如何处理我的报告以导出快递新 font
  • 在 Maxima 列表中查找最大值和索引?

    我有一个 maxima 列表 例如 x 1 3 7 98 211 3 2 44 23 我需要找到列表的最大值以及最大值位于哪个位置 我唯一想到的是将列表重写为序列并应用 max 命令 max first x second x last x
  • 具有摊销 O(1) 删除和 O(log n) 搜索的数据结构

    我需要一个支持两种操作的数据结构 删除和搜索 现在 删除操作应该运行在摊销 O 1 时间 而搜索应该运行在O log n time 搜索操作应该如下工作 查找指定的值 如果它在这里 则返回值本身 否则 返回最接近的较大值 返回有序后继 这个
  • 具有输入数组的方法

    我想要一种方法 可以像 NSArray 一样放置所需数量的参数 id initWithObjects id firstObj NS REQUIRES NIL TERMINATION 然后我可以使用 NSArray array NSArray
  • 获取 Boto3 中具有特定标签和值的 EC2 实例列表

    如何使用标签和值过滤 AWS 实例boto3 import boto3 ec2 boto3 resource ec2 client boto3 client ec2 response client describe tags Filters
  • 找到svg形状的中心

    我在用着svgjs创造我的形状 如何找到 svg 形状的中心点并在那里添加元素 就我而言 是一个红点 我在文档中找不到任何有助于解决这种情况的方法或内容的信息 你可以使用该方法getBBox https docs webplatform o
  • 实体框架异常“底层提供程序在打开时失败”

    我创建了一个 Windows 服务 它侦听 TCP IP 端口并使用实体框架将接收到的数据保存在数据库中 大多数时候它工作正常 但有时会抛出异常 底层提供程序打开失败 在数据库中保存数据 这是我的异常详细信息 Exception 2 27
  • 如何在tf.data.Dataset.map()中使用Keras的predict_on_batch?

    我想找到一种使用 Keras 的方法predict on batch inside tf data Dataset map in TF2 0 假设我有一个 numpy 数据集 n data 10 5 my data np random ra
  • Ajax推送系统

    在我自己的系统中 我有一个PHP页面显示我通过在线网上商店出售的所有商品 从最新交易到第一笔交易 我希望每当人们从我这里购买东西时 此页面就会自动更新 我可以做AJAX打电话给每个5几秒钟来检查我数据库中的订单 但这似乎是 1980 年 或
  • 在 Windows 10 分配的访问权限中运行 Chrome kiosk 模式

    好消息是Windows 10分配访问支持运行桌面应用程序 Win 8 1仅支持运行通用应用程序 我想在命令行中使用 kiosk 运行 Chrome 的 kiosk 模式 本文底部有教程 https technet microsoft com
  • 处理单例实例 (C#)

    如果单例实现了 IDisposable 那么处置和重新创建实例的正确方法是什么 一种方法是保留 dispose 标志并在 Instance 属性中检查它 但我不确定这是执行此操作的正确方法 一个简单的例子 public sealed cla
  • 盲目地用代替可以吗?

    Note I know b 是展示性的并且 span style font weight none span b
  • 在 Mac OSX 下检测连接的 USB 设备

    首先声明 对于 Mac 编程 我是一个新手 然而 我有一项任务需要与设备进行 USB 通信 所以我想我将从基本的东西开始 我从here https developer apple com library mac samplecode USB
  • 如何在 moment.js 中获取月份的简称?

    我已成功找到月份的全名 但我想要月份的简称 谁能帮我 我正在使用 Moment js 我已成功找到月份 但我想要简短的形式这是我的代码 var date var Month moment date YYY MM DD format DD M
  • 在 magento 前端显示缺货状态

    我需要在产品页面 前端 上显示当前商品仅用于延期交货 并且没有库存 目前 我的库存显示了可用数量 而缺货的产品则没有显示任何内容 有谁知道我可以在 view phtml 文件中放入一个代码 该代码只会在那些设置为缺货的产品上显示一条消息 T
  • 我应该使用 Java 中的哪个线程池?

    有大量的任务 每个任务都属于一个组 要求是每组任务应该像在单线程中执行一样串行执行 并且在多核 或多CPU 环境中吞吐量应该最大化 注意 组的数量也与任务数量成正比 最简单的解决方案是使用 ThreadPoolExecutor 并同步 或锁
Powered by Hwhale