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

Pau*_*lor 13 java concurrency executor threadpool

我使用线程池来执行任务,这些任务主要是基于cpu的I/O,大小比cpus的数量大1.

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)
Run Code Online (Sandbox Code Playgroud)

简单的程序的假设情况下提交的所有任务,在此执行程序并没有什么别的我假设有一个线程池的任何较大会减慢事情,因为操作系统将不得不时间片它的CPU往往机会给每个线程的线程池机会跑.

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

Pet*_*rey 9

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

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


小智 9

供参考,请查看此说明.

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

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

  • 如链接所示,最佳状态是N_CPU的“多个”。值得注意的是,您的应用程序将具有其他线程,并且少量IO仍在使用CPU。 (2认同)