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

2022-09-04 02:00:46

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

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

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

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


答案 1

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

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


答案 2

有关参考,请查看此说明。

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

简而言之,你拥有什么(没有。CPU + 1) 平均而言是最佳的。


推荐