2011-07-21 11 views
3

私は、Javaでマルチスレッドする方法を理解しようとしています。現在、私のプログラムは並行処理なしでうまく動作しますが、高速化に役立つマルチスレッドを実装したいと考えています。マルチスレッドjava

プログラムは、いくつかの別個のサブ・クラスのオブジェクトとそれらのオブジェクトの各々について時間評価の50%のみ8利用可能ではなく、一つのコアを利用するプロセスに費やされ実行されます。これらのオブジェクトは、プログラム内の入力として使用されるまで完全に独立しています。

私は、サブクラスは、Runnableを実装し、その後、私のプログラムは、そのような各オブジェクトのスレッドを使用していたことで、これをマルチスレッドしようとしています。これは正しい方法でしょうか?

しかし、どのようにJavaでスレッドがhandeledていますか?実行するたびにスレッドを処分する必要がありますか?参加はどのように行われますか?

ありがとうございました

+2

深刻なアプリケーションを作成する場合は、実際に理論を調べる必要があります。http://download.oracle.com/javase/tutorial/essential/concurrency/そうしないと、手動でスレッドを管理するために – home

答えて

5

あなたはかなり進んでいます。スレッドオブジェクトを作成します。

Runnable r = new MyClassImplementingRunnable(); 
Thread t = new Thread(p); 
t.start(); 
t.join(); // wait for thread to die 

Threadオブジェクトは、他のオブジェクトと同様にガベージコレクトされます。実行メソッドが完了するとスレッド自体は停止します。重要なことは、あなたのRunnableのrunメソッドが本当に復帰することを保証しなければならないということです。あなたの設計は外部からのスレッドを殺すことができないことに依存できません。

スレッドがたくさんある場合は、すべて終了するまで待つ必要があるため、開始したスレッドのコレクションを保持してから、t.join(smallNumberOfMillis)を使用して彼らは終わった。それは少し非効率なので、スレッドがお互いに通信できるようにするための他のテクニックがあります。私はそれらについてthis articleを読むことをお勧めします。

@denisもエグゼキュータと関連クラスはスレッド上よりよい抽象化を提供することを言及しています。背景を学ぶことに興味があるならば、手動でスレッドを管理するのは面白いです。仕事をやりたいだけなら、デニスの提案に従ってください。

+0

ないCOMME IL faut :-)それを苦労して学びます:) –

+0

はよくはい、それは彼が最初の基礎となる詳細を学ぶか、よりよい抽象化を使用した場合です。 – djna

+0

サブクラスでrunメソッドを設定するにはどうすればよいですか?今すぐnullpointer例外エラーが発生しました – randomafk

7

は、手動でスレッドを管理しないで、Javaで

+0

私は後でそれに見ていきますが、私は最初 – randomafk

+1

@randomafk HTEの基本のいくつかの理解を取得したい:これらは、* *基本です。 –

3

executors and thread poolsを見て、コンストラクタが希望するスレッドの数を取るhttp://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html

を見てみましょう。この場合、あなたのコア数と同じです。

ScheduledThreadPoolExecutor s = new ScheduledThreadPoolExecutor(8); 
List<Future> futures = new ArrayList<Future>(); 
foreach(...something...) 
    futures.add(s.submit(new MyCallable())); 
foreach(Future f : futures) 
    f.get(); // Result of computation 
System.out.println("Done"); 
+0

MyCallableクラスにはRunnableのような特殊な実行関数が必要ですか? – randomafk

+0

はい呼び出し可能はRunnableと似ていますが、インタフェースとして定義されている点を除いてCallable {V call(); }彼らはあなたの好みのタイプのオブジェクトを返すことができます。 http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/Callable.html –

0

これは、マルチスレッドを開始するのに適しています。

public class ThreadExample { 
    public static void main(String[] args) { 
     //Main thread 
     System.out.println("Main thread"); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       //This thread is independent of the main thread 
       System.out.println("Inner Thread"); 
      } 
     }).start(); 
    } 
} 
関連する問題