2016-04-13 11 views
1

コアよりスレッドが多いときに、Javaがマルチスレッドを処理する方法を誰かが教えてくれるのだろうかと疑問に思っていましたか?たとえば、私はクワッドコアを持っていますが、私のプログラムは8つのスレッドを使用しています。javaはマルチスレッドをどのように処理しますか?プロセスより多くのスレッド

私はいくつかの並列プログラミングをしたいので頼んでいるだけです。私はそれを使用して、配列のパフォーマンスを改善したい。

ありがとうございました。

編集: 私は並列プログラミングを使用して、コア数でアレイを分割するつもりです。だから、私は約50Kの配列を持っていますし、性能を向上させ、配列のサイズを増やすためにPPを使用することが望ましいでしょう。

+0

そして、1000スレッドを作成するパフォーマンステストスクリプトがあります。 1つのCPUは複数のスレッドを実行できますが、理解しているように、同時に1つのスレッドしかCPUを占有できません(ただし、2つのスレッドは同時に2つのCPUで実行できます)。 OSは、リソースの配分(CPU使用率、RAMなど)を処理します。しかし、それは言語とは関係ありません。 –

+0

しかし、1つのCPUであっても、マルチスレッド化はまだ一般的に高速です。 –

+0

@btquanto CPUに1000個のコア(またはハイパースレッディング付き500個のコア)がない限り、1000個のスレッドを開始しても、プログラムを高速に実行することはできません。これらのスレッドのほとんどは、スケジュールされるまで待機します。スレッドを追加するだけでは自動的にプログラムを高速化することはできません。 – Jesper

答えて

4

は、javaが

マルチスレッド処理する方法を私に知らせることができないのそれ(あなたが緑のスレッドを持っており、ほとんどのlikleyそうでない場合を除き)。 OSはスケジューリングを行います。

私はクワッドコアを持っていますが、私のプログラムは8スレッドを使用しています。

ハイパースレッディングを使用している場合は、すべて同時に実行できます。 BTWあなたは自分自身を作成し​​ていなくても、GCのためだけにCPUあたり1つのスレッドしか持っていない可能性があります。

私はいくつかの並列プログラミングをしたいです。アレイのパフォーマンスを向上させるために使用したい

私は、ビジースレッドの数をあなたが持っている論理CPUの数に保つことをお勧めします。実際には、これを組み込むのに役立つ図書館があります。 DoubleStream

double[] manyDoubles = .... 
DoubleSummaryStatistics dss = 
      DoubleStream.of(manyDouble) 
         .parallel()// do stuff in parallel using all the CPUS 
         .filter(x -> x >= 1) 
         .map(x -> x * x) 
         .summaryStatistics(); 
+0

答えに感謝します。クアッドコアと8つのスレッドが一例であり、私の主旨を説明するのに役立ちました。しかし、助けてくれてありがとう:)私は理解していると思う。ありがとうございます – DatAssKyle

+0

@DatAssKyleできるだけ早く並列ストリームで開始します。これはあなたが持っているすべてのCPUを効率的に使用し、コードもずっとシンプルになります。 –

関連する問題