如何知道当前JVM允许的最大可运行线程数?

时间:2012-08-07 00:13:45

标签: java

我有一个在多个不同环境中运行的多线程应用程序,我认为有时环境会限制可以同时运行的线程总数。特别是,我认为其中一个系统只允许单个线程运行,因此多线程没有任何好处。什么是一种简单的方法来判断这种情况何时发生?

ExecutorService exec = Executors.newFixedThreadPool(4);
TestRunnable tr = new TestRunnable();
for ( int i = 0; i < 20; i++ ) {
  try {
     exec.execute(sr);
  } catch (Exception E) {
  }
}

1 个答案:

答案 0 :(得分:1)

  

我有一个在多个不同环境中运行的多线程应用程序,我认为有时环境会限制可以同时运行的线程总数。

是的,环境确实限制了同时实际运行的线程数。具体做法是:

  • 与物理机或虚拟机上可用的处理器(或超线程)相比,硬件无法同时运行更多线程。
  • 各种操作系统限制可能会阻止您使用所有可用资源;例如基于ulimit和cgroup的限制。

  • 如果系统繁忙,您的JVM可能会与其他应用程序进程竞争。

  • Java代码中可能存在并发瓶颈;例如一个线程锁定某些数据结构经常占用其他线程的点。

但是,JVM本身并不会人为地限制你。

您可以使用Runtime.availableProcessors方法找出可用处理器的名义数量。


注意:“runnable”线程的数量与“running”线程的数量不同;即可以同时物理执行指令的线程数。 “可运行”线程的数量是可以计划执行的线程数...如果有足够的处理器可用。