首页 > 解决方案 > 在具有上下文切换的线程池执行器中执行连续运行的线程/任务

问题描述

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

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

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

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

标签: javamultithreadingperformanceparallel-processingthreadpoolexecutor

解决方案


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

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

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

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

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

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

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

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


推荐阅读