使用ExecutorService并行重复执行多个类似的任务

2024-01-02

Java 代码简化后如下所示:

while(someCondition)
{
    SomeType a = CalcResult(param1);
    SomeType b = CalcResult(param2);
    SomeType c = CalcResult(param3);

    // Do something with a, b and c
}

CalcResult()很费时间。该应用程序在 SMP 系统上运行。有人试图尝试在自己的 CPU 上同时运行所有三个计算,而不是按顺序运行它们。需要并行的始终是这 3 个任务,而不是任意数量的任务(这就是算法)。每项任务可能比其他任务花费更多或更少的时间,但通常差异不会那么大 (20-30%)。

由于他们需要返回结果,我查看了诸如此类的 Executor 服务解决方案https://stackoverflow.com/a/9148992/2721750 https://stackoverflow.com/a/9148992/2721750:

ExecutorService executor = Executors.newSingleThreadExecutor();
Callable<Integer> callable = new Callable<Integer>() {
    @Override
    public Integer call() {
        return 2;
    }
};
Future<Integer> future = executor.submit(callable);
// future.get() returns 2
executor.shutdown();

由于我对 Java 的经验主要是 servlet/JSP 开发,所以我没有线程方面的经验,并且不确定该代码片段是否适用于 3 个任务而不是一个任务。

如何同时提交3个任务,每个任务都有自己的参数值,并等待所有任务都返回计算结果确保为它们创建线程不会抵消在它们自己的 CPU 上运行的优势,即有没有办法在之前创建线程一次while()循环开始,然后简单地推入一个新的paramN进入循环内的每个线程,唤醒它们,并等待它们执行所有计算?


Executors.newSingleThreadExecutor()将仅创建一个线程。你想要的是Executors.newFixedThreadPool(3)。在 while 循环之前调用此函数,因此线程仅创建一次。

创建一个可调用包装器:

class MyCallable implements Callable<V> {
    P p;
    MyCallable(P parameter) {
        p = parameter;
    }
    V call() {
        return CalcResult(p);
    }
}

while 循环:

ExecutorService executor = Executors.newFixedThreadPool(3);
while (cond) {
    Future<V> aFuture = executor.submit(new MyCallable(param1));
    Future<V> bFuture = executor.submit(new MyCallable(param2));
    Future<V> cFuture = executor.submit(new MyCallable(param3));

    // this will block until all calculations are finished:
    a = aFuture.get();
    b = bFuture.get();
    c = cFuture.get();

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

使用ExecutorService并行重复执行多个类似的任务 的相关文章

随机推荐

  • 经典 ASP 中的线程休眠?

    我正在对用经典 ASP VbScript 编写的旧应用程序进行一些修改 它具有向应用程序的成员发送电子邮件的功能 但由于成员列表相当大 因此在发送前一百封左右后 服务器会拒绝新的电子邮件 我已经编写了一些代码 让它能够突发发送 20 封电子
  • Python中的栈是什么?

    Python 中的 堆栈 是什么 是CPython的C栈吗 我读到Python 堆栈帧是在堆中分配的 但我认为堆栈的目标是 堆栈堆栈帧 那么堆栈做什么呢 Python的栈帧是在堆上分配的 但它们相互链接形成一个堆栈 当函数a调用函数b th
  • 我应该通过什么方式检查 JNI 中的异常?

    我们知道 JNI 中的很多方法都可能会引发异常 并且异常引发后无法调用 从而可能导致 JVM 崩溃 我们不仅可以使用 ExceptionOccurred 或 ExceptionCheck 来确定是否发生异常 还可以简单地检查不等于 NULL
  • 如何在 Python 中从包含 N 行的 csv 文件创建嵌套字典

    我正在寻找一种方法将具有未知列数的 csv 文件读取到嵌套字典中 即用于输入表格 file csv 1 2 3 4 1 6 7 8 9 10 11 12 我想要一本以下形式的字典 1 2 3 4 6 7 8 9 10 11 12 这是为了允
  • 有没有一种安全的方法可以从Python中的线程创建子进程?

    我正在使用一些现有代码 这些代码创建了许多不同的工作线程 然后这些线程又使用子进程 多重处理调用一些 shell 脚本 据我所知 这是一个禁忌 因为互斥锁可能会在 exec 发生之前嵌入子进程的解释器中 这是一个合理的担忧吗 如果是这样 是
  • 更改 Oracle 客户端注册表中的 NLS_LANG 设置的影响

    我们正在从 NET Microsoft oracle 驱动程序迁移到 ODP NET 驱动程序 我们遇到的问题之一是这个错误 ORA 12705 无法访问 NLS 数据文件或指定的环境无效 我们能够通过修改注册表和更改设置来阻止错误 看到这
  • dom元素样式更改后如何调用函数Javascript/jquery

    我已经浏览了多个示例 并实现了示例所述的相同行为 页面加载后 如果 dom 元素的样式发生变化 我需要触发一个方法 即使我在浏览器控制台中更改任何内容 样式更改事件也应该触发 该事件将显示为 无 和 显示块 在我的代码中 如果在浏览器控制台
  • 如何为 Window Store 构建 Electron 应用程序?

    帮助构建 Window Store 的 Electron 应用程序 我为电子编译了一个简单的应用程序 我按照官方网站的说明进行尝试 我运行命令 electronics windows store input directory C Brai
  • spring-boot 如何提供特定的 url?

    以我之前的经验来看 当使用纯servlet 我们定义 servlet 以便它可以处理与特定 url 匹配的请求 使用时struts2 我们定义一个过滤器 以便它为匹配特定 url 的请求提供服务 使用时springMVC在传统的 xml 配
  • 简约 Qt 构建的推荐标志

    我正在尝试构建 Qt 因为 Visual Studio 2010 需要它 构建脚本 configure exe 非常简单 但默认情况下需要很长时间才能编译 在配备 SSD 的快速笔记本电脑上等待了一个小时后 我放弃了 不使用任何标志 仅使用
  • Visual Studio 2019 无法识别 tsconfig.json

    我刚刚安装了 Visual Studio 2019 并尝试了我当前的解决方案 似乎它忽略了tsconfig json文件 而它在 VS 2017 中工作 在 Visual Studio 2017 中的项目属性 TypeScript Buil
  • 如何使用PHP调用python脚本实时返回结果?

    我使用PHP调用python脚本成功并得到了结果 但我必须等待脚本运行结束而没有任何输出 它看起来对我的客户不友好 如何将脚本结果实时返回到PHP Web 例如 对于下面的代码 我希望 PHP Web 将实时显示输出消息 而不是在最后一起显
  • Xamarin Monodroid:WP7 => Android 和自定义控件?

    我正在使用 Xamarin Monodroid 将一些 Windows Phone 应用程序移植到 Android 我对 Xamarin 的东西还很陌生 实际上刚刚购买了许可证 到目前为止 在 AXML 中重新创建 XAML UI 方面效果
  • Heroku 推送问题

    我在将应用程序推送到 Heroku 时遇到问题 以下是我尝试使用 git push heroku master 时的终端输出 Counting objects 22 done Delta compression using up to 8
  • 谷歌在搜索结果中以不同方式显示网站标题

    Google 以与预期不同的方式显示我网站的页面标题 页面标题应该是 布莱顿和刘易斯 平面设计师刘易斯 沃利斯平面设计 它在必应 雅虎和我的实际网站上显示良好 然而 谷歌以不同的方式显示它 刘易斯 沃利斯平面设计 平面设计师布莱顿和刘易斯
  • 如何在 Power BI 中按度量筛选结果

    我需要能够按度量进行筛选 以便在 Power BI 中显示更精细的结果 我希望能够选择百分比在某个范围内的位置 或者 100 我对度量的计算是这样的 每列只能是 1 或 0 errorPercentage CALCULATE SUM mis
  • React/react hooks:状态更改后子组件不重新渲染?

    我正在react react hooks中编写一段代码 尝试执行以下操作 从父组件获取对象数组作为 prop 使用将其设置为状态useState钩 根据预期的过滤器 时间和评级 对状态进行排序 然后重新渲染子组件 我看到的是 下面的代码在排
  • 如何在 Spark 中向 Kryo 注册 InternalRow

    我想使用 Kryo 序列化运行 Spark 因此我设置spark serializer org apache spark serializer KryoSerializer and spark kryo registrationRequir
  • Apache - 本地主机访问文件夹的域 http://folder.local

    我在 Ubuntu 上运行 XAMPP 我想为我的项目创建一个虚拟主机 这样我就可以为我的服务器根目录 例如 local 分配一个 tld 并且可以通过 URL 访问其中的文件夹 如下所示http foldername local 另外 使
  • 使用ExecutorService并行重复执行多个类似的任务

    Java 代码简化后如下所示 while someCondition SomeType a CalcResult param1 SomeType b CalcResult param2 SomeType c CalcResult param