在上下文切换的线程池执行器中连续执行 运行 threads/task

Executing continuously running threads/task in thread pool executor with context switching

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

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

我们有实现相同功能的线程池变体吗?或者其他实现方式?

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

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

In short, I want another implementation of FixedThreadPoolSize, where extra tasks should also run with context switching.

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

Do we have Thread Pool variant which achieves same? Or any other way to implement it?

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

My use case is I have to run n tasks continuously. But as those tasks are memory intensive I want only x of them to be active at a time. But ultimately all those n tasks should run by context switching between them.

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

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