13

我使用线程池来执行任务,这些任务主要基于 cpu,带有一点 I/O,大小比 cpu 的数量大一。

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

假设一个简单的程序将其所有任务提交给这个执行程序并且几乎不做其他事情,我认为拥有一个更大的线程池会减慢速度,因为操作系统必须更频繁地对它的 CPU 进行时间切片,从而有机会让线程池中的每个线程都有机会跑。

这是正确的,如果是这样,这是一个真正的问题还是主要是理论上的问题,即如果我将线程池大小增加到 1000,我会注意到一个巨大的差异。

4

2 回答 2

11

如果您有 CPU 密集型任务,随着线程数量的增加,您会增加开销并降低性能。注意:拥有比等待任务更多的线程只是浪费资源,但可能不会减慢任务的速度。

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

于 2012-10-18T09:22:19.860 回答
9

作为参考,请查看此说明。

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

简而言之,平均而言,您拥有的(No. CPU + 1)是最佳的。

于 2012-10-18T09:34:25.020 回答