在Java中运行基于cpu的简单程序的最佳线程池大小是多少

时间:2012-10-18 09:14:18

标签: java concurrency threadpool executor

我使用线程池来执行任务,主要是基于cpu的I / O, 比cpus的数量大一号。

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)

假设简单程序将其所有任务提交给此执行程序并且没有其他功能,我认为拥有一个更大的线程池会减慢速度,因为操作系统必须将它更频繁地cpus更频繁地给予线程池中的每个线程机会有机会跑。

这是否正确,如果是这样,这是一个真正的问题,或者大多数是理论问题,即如果我将线程池大小增加到1000,我会注意到一个巨大的差异。

2 个答案:

答案 0 :(得分:11)

供参考,请查看此说明。

http://codeidol.com/java/java-concurrency/Applying-Thread-Pools/Sizing-Thread-Pools/

简而言之,你所拥有的(编号CPU + 1)平均是最佳的。

答案 1 :(得分:9)

如果你有CPU绑定任务,当你增加线程数时会增加开销和降低性能。注意:拥有比等待任务更多的线程只是浪费资源,但可能不会减慢任务的速度。

我会使用cpus数量的倍数(例如1或2),而不是只添加一个因为太多线程可能会产生惊人的开销。