2012-02-29 17 views
1

あらかじめご迷惑をおかけしています。私はPythonからマルチプロセッシングについて学びましたが、Javaのアプローチを理解するのに少し問題があります。 Pythonでは、私は4つのプロセスのプールをしたいと私のプログラムに仕事の束を送信し、それは一度に4つの項目で動作すると言うことができます。私は、Javaでは、この同じタスクを達成するためにスレッドを使用する必要があり、これまでのところ本当にうまく機能しているように見えます。問題を理解するJavaスレッド

しかし、私のCPUは100%の利用率を得ていません(彼らは約70-80%です)。私はスレッドを作成している方法を疑っています(コードは同じですpython/javaとprocesesは独立しています)。

for (int i = 0; i < 500; i++) { 
     Runnable task = new MyRunnable(10000000L + i); 
     Thread worker = new Thread(task); 
     // We can set the name of the thread 
     worker.setName(String.valueOf(i)); 
     // Start the thread, never call method run() direct 
     worker.start(); 
     // Remember the thread for later usage 
     threads.add(worker); 
    } 

私はhereからそれを取った:Javaでは、私はこのように、私は私が処理したいリスト内のすべての項目のためのスレッドを作成するように、一つのスレッドを作成するかどうかはわかりません。私の質問はこれをスレッドを起動する正しい方法ですか、それともJava自体にスレッドの数を管理させる方法がありますか?誰もが思っているように、私のコードをできるだけ速く走らせたいと思っています。スレッドがたくさん作成されることから生じるかもしれない問題の解決方法を理解しようとしています。これは大きな問題ではなく、Javaフードの下でどのように動作するのか不思議です。

ありがとうございます!

答えて

4

http://docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

しかし、Javaの並行処理のチュートリアルを見てみましょうExecutor API。たとえば、articleを参照してください。

スレッドを作成するのは以前よりずっと安くなっていますが、大量のスレッドを作成することはできません。あまりにも多くのコンテキストの切り替えに終わるでしょう。

Executor APIを使用すると、Runnableタスクを実行するためのさまざまなタイプのスレッドプールを作成できるため、スレッドを再利用したり、作成された番号を柔軟に管理したり、スレッドごとのスレッドのオーバーヘッドを回避できます。

JavaスレッドモデルとPython スレッディングモデル(マルチプロセッシングではない)モデルは、偶然にも非常によく似ています。 Pythonのようにグローバルインタープリタロックはありませんので、通常は複数のプロセスをフォークする必要はありません。

+0

+1ありがとうございます。私はスレッドに関してこの気持ちを持っていましたが、私がそれらの産卵をコントロールすることができなかったので(私がそれをやっていたやり方で)、私はハックしてそれをもっとテストすることができませんでした。私はエグゼクティブがまさに私がこれを行うために使えるものだと思います。もう1つの質問(やや関連しています)は、エグゼキュータがスレッドの静的な数を管理していますか、または余分な容量がある場合、exectorは必要に応じてスレッドを自動的に起動しますか? –

+0

固定スレッドプールを作成するのか、キャッシュドスレッドプールを作成するのかによって、どちらも可能です。 – DNA

5

Executorを使用します。この実装では、スレッドのプールを処理し、数を決定します。多数の例については、the Java tutorialを参照してください。

一般に、非常に単純なことを除いて、Javaではベアスレッドは使用されません。代わりに、RunnableやTaskを受け取り、何をすべきかを知っている、より高レベルのAPIがあります。

+0

+1。 ExecutorsとExecutorServicesは、コア間でタスクを分散させる方法です。 –

+0

あまりにもジョシュ、ありがとう。エグゼクティブをもっと深く見て周りを遊ぶ。再度、感謝します! –

2

スレッドは「低レベル」のAPIです。

あなたが何をしたいか、あなたが使っているJavaのバージョンに応じて、より良い解決策です。あなたは、Java 7を使用している場合は、あなたのタスクは、それは、あなたがフレームワークに参加/フォークを使用することができます許可している場合 は:Javaのを見てみましょうhttp://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html