【问题标题】:Executing continuously running threads/task in thread pool executor with context switching在具有上下文切换的线程池执行器中执行连续运行的线程/任务
【发布时间】:2021-05-17 11:45:36
【问题描述】:

我想连续运行 n 个任务,但是这些任务是内存密集型的,我希望一次只有 x 个任务处于活动状态。但最终所有这些 n 个任务都应该通过它们之间的上下文切换来运行。

简而言之,我想要 FixedThreadPool 的另一个实现,其中额外的任务也应该通过上下文切换运行。

我们是否有实现相同的线程池变体?或者有什么其他的实现方式?

更新:在阅读了一些内容并阅读了下面的答案后,决定“分而治之”,即将连续运行的任务分解为小短命任务的单元,然后一次又一次地提交给FixedThreadPool

【问题讨论】:

    标签: java multithreading performance parallel-processing threadpoolexecutor


    【解决方案1】:

    你可以写一篇关于这个主题的论文,但让我们保持简单明了。

    简而言之,我想要 FixedThreadPoolSize 的另一个实现,其中 额外的任务也应该通过上下文切换来运行。

    要实现这一点,需要一个线程池,它允许显式在线程和核心之间执行关联。而且(据我所知)Java 并未正式提供这样的线程池。这是有道理的,因为诸如线程池(在 Java 中)之类的抽象的目标之一是提高抽象级别,甚至达到抽象概念(例如线程)的程度(ie, Executor) .因此,没有开箱即用地提供这种低级功能(如将线程映射到内核)也就不足为奇了。

    我们是否有实现相同的线程池变体?或任何其他方式 实施它?

    除非您在 Non-Uniform Memory Access (NUMA) 架构中运行代码,否则我看不到在您的程序上下文中使用这种低级功能的好处。

    我的用例是我必须连续运行 n 个任务。但作为那些任务 是内存密集型我希望一次只有 x 个处于活动状态。但 最终所有这些 n 任务都应该通过上下文切换来运行 他们。

    如果您运行n 任务和n 线程,并且运行代码的硬件具有c 内核,其中n >> c,那么SO 不可避免地会将多个线程映射到同一个内核。因此,您将有您的 上下文切换 免费

    最后,在实际选择运行比内核更多的线程之前,相应地分析您的代码。例如,使用与内核相同数量的线程运行代码,然后将线程数量增加一倍,直到它停止扩展。您的代码甚至可能使用比内核更多的线程进行扩展。

    【讨论】:

    • 谢谢,这很有用。现在我将连续运行的任务分成子任务(短期生活)并一次又一次地提交(只是为了让它连续运行)到 FixedThreadPool
    猜你喜欢
    • 2013-07-22
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2014-12-05
    • 2014-08-27
    • 2017-12-29
    • 1970-01-01
    相关资源
    最近更新 更多