11

私はマルチスレッドにかなり慣れていません。Javaプログラムで4つのCPUを利用しようとしているプロジェクトに取り組んでいます。私は次のようなことをしたかった

int numProcessors = Runtime.getRuntime().availableProcessors();
ExecutorService e = Executors.newFixedThreadPool(numProcessors);

これにより、CPUごとに1つのスレッドが機能することが保証されますか?スレッドを作成するとき、システムはビジーではありませんが、しばらくすると非常にビジーになります。OSはスレッドを作成するために最もビジーでないCPUを選択すると思いましたが、作成時に特にビジーなCPUがない場合、どのように機能しますか?

また、スレッドプールサービスはスレッドを再利用することになっていますが、別のCPUでより多くの可用性があることがわかった場合、スレッドを強制終了して新しいスレッドを生成しますか?

4

3 に答える 3

2

いいえ、スレッドが実行される場所については何も保証されません

実際、OSスレッドスケジューラは、適切と思われるコアの周りでスレッドを自由に移行できます(したがって、1つの行をコア0に、次の行をコア4に配置できます)

スレッドのアフィニティを設定することはできますが、これはJavaでは直接利用できません(AFAIK)

于 2012-12-13T18:32:55.887 に答える
2

これにより、CPUごとに1つのスレッドが機能することが保証されますか?

同時に実行する必要のあるタスクが4つある場合は、それぞれにスレッドがあると予想できます。HotSpot JVMでは、プールを作成するときに実際のスレッドのプロキシであるThreadオブジェクトが作成されます。実際のスレッドがいつ作成されるか、そしてどのように作成されるかはあなたにとって重要です。

スレッドを作成するとき、システムはビジーではありませんが、しばらくすると非常にビジーになります。OSはスレッドを作成するために最もビジーでないCPUを選択すると思いましたが、作成時に特にビジーなCPUがない場合、どのように機能しますか?

スレッドはOSによって作成され、スケジュールするスレッドのリストに追加されます。

また、スレッドプールサービスはスレッドを再利用することになっていますが、別のCPUでより多くの可用性があることがわかった場合、スレッドを強制終了して新しいスレッドを生成しますか?

Javaはその問題について何も言いません。OSが決定します。スレッドを強制終了して再起動することはありません。

あなたが提案するように、スレッドはCPUに結び付けられていません。OSは、実行する必要のあるスレッドと空きCPUに基づいて、CPU間でスレッドを渡します。

于 2012-12-13T18:33:08.827 に答える
1

「別のCPUでより多くの可用性があることがわかった場合、スレッドを強制終了して、そこに新しいスレッドを生成しますか?」

使用可能なCPUを使用するために、別のCPUを強制終了してスポーンする必要はありません。スレッドは、特定のCPUにバインドされていないメモリオブジェクトであり、あるCPUから別のCPUにフロートする可能性があります。スレッドの実行は次のようなループです。

  • Thread.start()スレッドをプロセッサキューに入れます
  • 使用可能なプロセッサがある場合、スケジューラはプロセッサキューの最初のスレッドを取得してプロセッサに配置します
  • スレッドが占有されたロックをブロックするか、I / O操作の終了を待機している場合、スレッドはプロセッサから切り離され、対応するキューに入れられます。ロックが解放されるか、I / O操作が終了すると、スレッドはそのキューからプロセッサキューに戻されます。
  • スレッドがブロックせずに長時間動作する場合(o / sに依存する時間、たとえば50ミリ秒)、割り込みが発生し、スケジューラーはプロセッサーキューにスレッドがあるかどうかを確認します。存在する場合、現在のスレッドはプロセッサから取り出されてプロセッサキューの最後に配置され、キューの最初のスレッドがプロセッサに配置されます。このようにして、実行時間の長いスレッドは他のスレッドも実行できるようにします。

その結果、スレッドは状態を変更することがよくありますが、これはプログラマーには透過的です。スレッドの全体的な考え方は、スレッドはプロセッサのモデルであり、実際のプロセッサよりも便利であるということです。そのモデルを使用し、本当に必要になるまで、プロセッサ上のスレッドのマッピングについて心配する必要はありません。

于 2012-12-14T09:15:21.537 に答える