Java的线程池的大小和availableProcessors()(Java Threadpool

2019-07-18 05:16发布

我有一个运行的程序(全天)在并行任务(在任务没有I / O被执行),所以我用Executors.newFixedThreadPool(poolSize)来实现它。

起初,我设置poolSizeRuntime.getRuntime().availableProcessors()但我还是有点担心,因为有相同的PC(32个内核)上运行的其他进程使用所有可用的核心。

特别是我有另外十JVM上运行同一程序(在不同的输入数据),所以我有点担心,有可能是一个开销很大的线程可用核心之间的切换而言,这可能整体计算减缓。

我应如何决定池的大小为每个程序/ JVM?

此外,在我的电脑中,有运行所有的时间(防病毒,备份等)的进程。 我应考虑到这些呢?

Answer 1:

任何意见将是依赖于您的具体情况。 10个JVM中的32个核心建议3个每个线程(忽略垃圾收集线程,定时任务等...)

你也有其他任务的运行。 调度会确保他们正在运行,但是他们必须要回应? 比JVM更好的响应? 如果你正在运行的Linux / Unix,那么你还可以利用优先级(通过nice ),以确保特定的进程不会养猪的CPU。

最后,你正在运行的JVM 10。 请问这项事业分页? 如果是这样,那将是缓慢的,你可能会更好,以避免消耗那么多的内存中运行的JVM少。

只要确保你的关键变量暴露和可配置的,为了找到最佳的一个衡量各种情况。



Answer 2:

我应如何决定池的大小为每个程序/ JVM?

你想线程,这将让你接近99%的使用率并没有更多的数量。

平衡工作最简单的方法是在运行一次,在同时处理多个文件,并只使用一个线程池的过程。 你可以设置你作为一个服务的过程,如果你需要通过命令行启动文件。

如果由于某种原因,是不可能的,你将需要推测将会有多少线程池应该由收缩。 尝试运行一个进程,并期待在利用率。 如果一个人说是40%,那么我怀疑10个过程是超过了400%利用。 也就是说,你可以通过4倍减少池的大小。



Answer 3:

不幸的是,这是知道辛苦的事情,因为程序通常不知道还有什么或在同一机器可能什么。

“易”的出路是使池大小配置。 这允许谁控制程序/盒来决定多少线程分配给你的程序(可能使用他们的箱子一般工作量的知识)的用户。

更复杂的解决办法是尝试以编程方式确定盒子目前的工作量,并从适当选择池的大小。 该解决方案的有效性取决于你如何能够准确地确定工作量和潜在的适应,因为它随时间变化。



Answer 4:

尝试grepping的过程,检查顶部/任务管理器和性能监视器来验证此实现实际影响您的计算机。

这篇文章似乎包含你正在试图实现什么有趣的信息: http://www.ibm.com/developerworks/library/j-jtp0730/index.html



文章来源: Java Threadpool size and availableProcessors()