Java 检查和控制申请数量';s实际并行运行的线程

Java 检查和控制申请数量';s实际并行运行的线程,java,multithreading,concurrency,parallel-processing,Java,Multithreading,Concurrency,Parallel Processing,假设我有一个生成和启动N个线程的Java应用程序。我在4核的Linux或Windows机器上运行它。我假设,如果我的应用程序创建了一堆线程,那么在任何时候,其中的4个线程(如果内核使用超线程,则会有更多线程)会同时执行 有什么方法可以检查/验证它吗?我知道在Java中可以打印Runtime.getRuntime().getAvailableProcesses(),但这个数字是否总是意味着并行运行的线程数?我应该研究一些操作系统设置吗 有没有可能,并行性会受到操作系统或某些JVM设置的限制?(比如

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

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

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

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

    没有必要使你的软件过于复杂。如果您使用的线程数与
    Runtime.availableProcessors()
    报告的核心数相匹配(多几个不会有问题),那么您已经尽力支持使用所有核心。如果您的应用程序不能使用所有内核,那么这并不重要,因为多几个线程的开销可以忽略不计。我们不是在谈论成千上万的线程

    只使用太少可能会使资源闲置