2011-01-15 25 views
0

Eclipseで実行するのにかなり時間がかかるプログラムを作成しました。私のCPUを25%にしかロードしていないので、それはさらに時間がかかります(私はクワッドコアを使用しており、プログラムは1つのコアを使用していると仮定しています)。プログラムが最大限に活用するために4つのコアをすべて使用する方法はありますか? Javaはネイティブにマルチスレッドになっているはずなので、なぜ25%しか使用しないのか分かりません。Javaアプリケーションが使用するCPUの量を手動で増やす

+0

それはどのようにプログラムされているかによって異なります。本当に複数のスレッドを使用していますか? – lweller

+0

あなたのコードを見ることなく、提案をするのは難しいです。あなたは今スレッドを使っていますか?出入りするデータはどこにありますか(つまり、プログラムに他のボトルネックがありますか) –

+1

Thread、Executors、Runnableのクラスを見てください。それは途中であなたを助けるかもしれません。 – extraneon

答えて

1

Javaはマルチスレッドですが、アプリケーションが1つのスレッドでのみ実行される場合は、1つのスレッドのみが使用されます。 (Javaがファイナライズ、ガベージコレクションなどのために使用する内部スレッドとは別に)

コードで複数のスレッドを使用する場合は、自分でスレッドを開始するか、パーティースレッドプール。後者の方が安全であることをお勧めしますが、どちらも同じようにうまくいくことができます。

3

アプリケーションで手動でスレッドを手動で作成および管理する必要があります。 Javaでは、2つのタスクを非同期に実行し、自動的に作業を複数のスレッドに分割することはできません。

+0

どうすればいいですか?私はまだJavaに深く掘り下げていません。 – SkylineAddict

2

これは、あなたのプログラムが何をしているのかわからないので、かなり曖昧な質問です。あなたのプログラムがシングルスレッドの場合、あなたのマシン上のコア数はそれ以上速く動くことはありません。 Javaにはスレッドのサポートがありますが、自動的にコードを並列化することはありません。それをスピードアップするには、互いに並列に実行できる計算の部分を特定し、分割して再構成するために適切なコードを追加する必要があります。あなたのプログラムが何をするかについての情報がなければ、私はあなたを助けることができません。

Javaスレッドはシステムスレッドと同じではありません。 JVMには、実際のシステムスレッドにJavaスレッドを公平に配置しようとする独自のスレッドスケジューラが用意されていることがよくありますが、それが実際に保証されるわけではありません。

2

はい、Javaはマルチスレッドですが、マルチスレッドは「魔法」ではありません。

スレッドクラスまたはExecutorフレームワークのいずれかを見てください。基本的に、あなたは、このような何かを、単一のプロセッサ上で実行することができ、それぞれが「サブタスク」にあなたの仕事を分割する必要があります。

Executor ex = Executors.newFixedThreadPool(4); 
while (thereAreMoreSubtasksToDo) { 
    ex.execute(new Runnable() { 
    public void run() { 
     ... do subtask ... 
    } 
    }); 
} 

パラレル一つにシリアルルーチン/アルゴリズムを回すと、必ずしも容易ではありません。特に「スレッドセーフティ」と呼ばれる一連の問題について知っておく必要があります。 thread-safety in Javaについて書いた資料に興味があり、リンクをたどると一般的にスレッド化します。キーとなる点は、データ/オブジェクトが実行中の異なるスレッド間で共有されている場合、特別な予防措置を取る。それは、あなたがただ「同じ時間に走る」ことを望む独立したものについては、上記のパターンがあなたを始めるでしょう。

0

あなたは少し前から学習しています(実際にはかなり学習しています)。しかし、深刻なプログラミングをしているのであれば、あなたがすべきことを学んでいます。

ここでの出発点です:http://download.oracle.com/javase/tutorial/essential/concurrency/

しかし、あなたは、Javaマルチスレッドに良い本(私はずっと前に、私がお勧めする可能性のある本は絶版になるとこれをしなかった)の中に見たいと思うかもしれません。この種の難題は、オンラインチュートリアルの代わりにテキストから学習するのに適しています。

関連する問題