【发布时间】:2013-01-15 19:49:25
【问题描述】:
我有一个程序(全天)并行运行任务(要执行的任务中没有 I/O),所以我使用了Executors.newFixedThreadPool(poolSize) 来实现它。
最初我将poolSize 设置为Runtime.getRuntime().availableProcessors(),但我有点担心使用所有可用内核,因为在同一台PC(32 个内核)上运行着其他进程。
特别是我有十个其他 JVM 运行相同的程序(在不同的输入数据上),所以我有点担心在可用内核之间切换线程方面可能会有很多开销,这可能会减慢整体计算。
我应该如何决定每个程序/JVM 的池大小?
另外,在我的电脑中,还有其他进程一直在运行(防病毒、备份等)。我也要考虑这些吗?
【问题讨论】:
-
您只担心在自己的计算机上运行这个程序吗?如果是这样,您为什么不尝试一个特定的选择,查看您的 CPU 使用情况,并进行相应的调整。也许你可以在这里发布你的发现。
-
非常重要的注意事项,来自
Runtime.availableProcessors()的 Javadocs -“在虚拟机的特定调用期间,此值可能会发生变化。”换句话说,这种方法并没有做你认为它做的事情。相反,可以通过属性文件或命令行参数来配置线程池的大小。
标签: java size threadpool