1

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

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

1 回答 1

1

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

是的,环境确实限制了实际上可以同时运行的线程数。具体来说:

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

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

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

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

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


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

于 2012-08-07T02:33:28.493 回答