让我们说我有Java应用程序产生并启动N个线程。我在具有4个内核的Linux或Windows机器上运行它。我认为,如果我的应用程序创建了一堆线程,那么它们中的任何一个(或者更多,如果核心使用超线程?)正在同时执行。
Runtime.getRuntime().getAvailableProcesses()
,但这个数字是否总是表示并行运行的线程数?我应该考虑一些操作系统设置吗?答案 0 :(得分:1)
例如,查看Windows TaskManager
(其他操作系统将使用类似的工具)。它回答了两个问题:你可以告诉它显示每个核心的CPU负载,这样你就可以看到并行运行的数量。您可以右键单击某个进程并告诉操作系统限制该进程的核心使用情况。请注意,在使用Windows 7和Java 7u40的计算机上,当我使用TaskManager更改处理器时,方法Runtime.availableProcessors()
立即反映了更改的处理器数量。
但即使允许进程使用所有核心(默认),如果另一个进程同时使用一个或多个核心,它也可能使用较少的进程。那是多任务的。没有解决方案,因为每次尝试获得可用内核的实际数量都会因为该数字在下一个纳秒内正确变化而变得过时。
没有必要使您的软件过于复杂。如果您使用Runtime.availableProcessors()
报告的与核心数相匹配的线程数(还有一些不会受到影响),则您已尽力支持使用所有核心。如果您的应用程序无法使用所有内核,则无关紧要,因为几个线程的开销可以忽略不计。我们不是在谈论成千上万的线程......
只使用太少可能会使资源闲置。