在具有2个内核的计算机上拥有2个以上的工作线程是否有意义?

时间:2015-03-12 06:19:26

标签: java multithreading

想象一下,我有一组输入(例如Queue<ISomeInputDataItem>)。我有一个ExecutorService,它有几个工作线程从该集合中获取输入项,处理它们并将结果放入输出集合中。输入和输出集合中的项目顺序无关紧要。

如果我在具有X内核的机器上运行此代码,那么线程池中的工作线程数应该是X是正确的,因为

  1. 如果小于X,则在处理输入和
  2. 期间不会使用某些核心
  3. 计算中涉及的线程数量受核心数量的限制(如果我有2个工作线程和1个核心,它们将最终共享该核心的时间)
  4. 注意:我只对上面给出的条件下的Java线程池感兴趣(并非在所有可能的一般情况下)。

3 个答案:

答案 0 :(得分:4)

如果线程是CPU绑定的,也就是说,代码永远不会等待任何东西,并且限制率是处理滴答,那么使用X是最佳的。虽然在我对Java 6的测试中使用高达2X的运行效果很好。(即使4X只是轻微的减速,但是YMMV)

但是,如果线程在磁盘或网络IO,同步数据结构,GPU等上花了很多时间,那么你应该使用多于X的数据,这样即使有几个人在等待,也几乎总是会运行。

答案 1 :(得分:1)

添加@ user949300所说的内容,

如果您的程序在具有其他可运行进程的计算机上运行,​​那么拥有更多可运行的线程可能为您的程序提供竞争优势。这取决于操作系统调度程序策略是否给出了公平的份额&#34;每个进程或每个线程的公平共享。如果它是后者,那么具有更多可运行线程的程序将获得更大的份额。

答案 2 :(得分:0)

如果我在具有X内核的机器上运行此代码,那么线程池中的工作线程数应该是X是正确的,因为

如果小于X,则在处理输入期间不会使用某些内核 计算中涉及的线程数量受核心数量的限制(如果我有2个工作线程和1个核心,它们将最终共享该核心的时间)


这是完全正确的。除此之外,即使您有2个内核和2个工作线程,如果它们为Queue共享的基础数据结构是ArrayList,或者事实上是任何连续的块,它们最终会产生相同的性能滞后。

  • 这是因为,数据结构作为页面加载到内存中,并且在连续块的情况下,一旦队列被一个线程锁定(通过将页面加载到内存中),另一个线程必须等到它被释放。