我有一个程序,它并行运行(全天)任务(任务中没有I/O要执行),所以我用Executors.newFixedThreadPool(poolSize)
来实现它。Java线程池大小和availableProcessors()
最初,我将poolSize
设置为Runtime.getRuntime().availableProcessors()
,但由于在同一台PC上运行了其他进程(32个内核),所以我有点担心要使用所有可用的内核。
特别是我有十个其他JVM运行相同的程序(在不同的输入数据上),所以我有点担心在可用内核之间切换线程可能会有很多开销,下整体计算。
我该如何决定每个程序/ JVM池的大小?
此外,在我的电脑中,还有其他进程一直在运行(防病毒,备份等)。我是否也应该考虑到这些?
你只担心自己的计算机上运行此程序?如果是这样,为什么不尝试一个特定的选择,查看您的CPU使用情况,并相应地进行调整。也许你可以在这里发表你的发现。 – BlackVegetable
需要特别注意的是,从Runtime.availableProcessors()''的Javadocs中注意到 - “在特定的虚拟机调用期间,该值可能会发生变化。”换句话说,这种方法不会做你认为它的做法。相反,可以通过属性文件或命令行参数来配置线程池的大小。 – Brian