使用上下文切换在线程池执行器中执行连续运行的线程/任务

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

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

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

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

回答

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

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

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

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

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

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

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

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


以上是使用上下文切换在线程池执行器中执行连续运行的线程/任务的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>