1

複数の異なる環境で実行するマルチスレッド アプリケーションを使用していますが、同時に実行できるスレッドの総数が環境によって制限される場合があると思います。特に、システムの 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

複数の異なる環境で実行するマルチスレッド アプリケーションを使用していますが、同時に実行できるスレッドの総数が環境によって制限される場合があると思います。

環境によって、実際に同時に実行できるスレッドの数が制限されます。具体的には:

  • ハードウェアは、物理マシンまたは仮想マシンで使用可能なプロセッサ (またはハイパースレッド) よりも多くのスレッドを同時に実行できません。
  • さまざまな OS の制限により、利用可能なすべてのリソースを使用できない場合があります。たとえば、ulimit および cgroup ベースの制限。

  • システムがビジー状態の場合、JVM が他のアプリケーション プロセスと競合している可能性があります。

  • Java コードに並行性のボトルネックが存在する可能性があります。たとえば、あるスレッドがデータ構造をロックしているために、他のスレッドが頻繁にロックされているポイント。

ただし、JVM 自体が人為的に制限することはありません。

メソッドを使用して、使用可能なプロセッサーの想定上の数を調べることができますRuntime.availableProcessors


注: 「実行可能な」スレッドの数は、「実行中」のスレッドの数と同じではありません。つまり、物理的に同時に命令を実行できるスレッドの数です。「実行可能な」スレッドの数は、実行のためにスケジュールできるスレッドの数です...十分な数のプロセッサが利用可能な場合。

于 2012-08-07T02:33:28.493 に答える