java - 检查和控制实际并行运行的应用程序线程数

标签 java multithreading concurrency parallel-processing

假设我有一个 Java 应用程序,它生成并启动 N 个线程。我在 4 核的 Linux 或 Windows 机器上运行它。我假设,如果我的应用程序创建了一堆线程,那么任何时候都会有 4 个线程(或者更多,如果核心使用超线程?)同时执行。

  1. 有什么方法可以检查/验证吗?我知道在 Java 中你可以打印 Runtime.getRuntime().getAvailableProcesses() ,但是这个数字是否总是意味着并行运行的线程数?我应该研究一些操作系统设置吗?
  2. 并行性是否有可能受到操作系统或某些 JVM 设置的限制? (就像说即使您可以一次运行 X 个任务,您的应用程序也将被限制为只有 X/2 个)。

最佳答案

例如,看看Windows TaskManager(其他操作系统也有类似的工具)。它回答了这两个问题:您可以告诉它显示每个单独核心的 CPU 负载,以便您可以看到有多少并行运行。您可以右键单击一个进程并告诉操作系统限制该进程的核心使用。请注意,在我使用 Windows 7 和 Java 7u40 的计算机上,当我使用 TaskManager 更改处理器数量时,Runtime.availableProcessors() 方法立即反射(reflect)了更改后的处理器数量。

但是,即使一个进程被允许使用所有核心(默认),如果另一个进程同时使用一个或多个核心,它可能会使用更少的核心。这就是多任务处理。没有解决方案,因为每次尝试一次获取可用核心的实际数量都将变得过时,因为该数字可能会在下一个纳秒发生变化。

无需使您的软件过于复杂。如果您使用的线程数与 Runtime.availableProcessors() 报告的核心数相匹配(多一些也没什么坏处),那​​么您已经尽力支持使用所有核心。如果您的应用程序无法使用所有核心,也没关系,因为更多线程的开销可以忽略不计。我们不是在谈论数千个线程......

使用太少可能会导致资源未得到利用。

关于java - 检查和控制实际并行运行的应用程序线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21692732/

相关文章:

java - 如果时区设置为 "XXX",SimpleDateFormat 将忽略 "UTC"

ios - NSManagedObjectContext.performBlockAndWait() 在主线程/队列上运行 block

java - Java中的关键字Volatile在单核机器上强制内存同步吗?

node.js - Node.js 中 GAE 基本扩展的并发性

java - 将部分添加到变量[]

java - 从字符串中删除指定字符

java - 我的 Maven 构建中缺少 AbstractAnnotationConfigDispatcherServletInitializer

c# Entity Framework 与线程

c# - 每个 CPU 线程的实际限制是多少?

python - Django后台无限循环进程管理