2012-03-05 10 views
16

実行可能ファイルの同じインスタンスで2つのスレッドを初期化するのは悪いプログラミングですか?実行可能ファイルの別のインスタンスでどのような相違点を初期化するのか、実行可能ファイルの同じインスタンスに対してメモリ位置を共有することはパフォーマンスと関係がありますか? H以来実行可能ファイルの同じインスタンスで2つのスレッドを初期化する

public static void main(String[] args)throws Exception { 
    H h = new H(); 
    H h2 = new H(); 
    Thread j = new Thread(h); 
    j.setName("11"); 

    Thread jj = new Thread(h);//instead of new H() 
    jj.setName("22"); 
    j.start(); 
    jj.start(); 
} 

class H implements Runnable { 
    public void run() { 
     while(true) { 
      System.out.println(Thread.currentThread().getName()); 
     } 
    } 
} 

答えて

17

実行しているコードがそれをサポートするように設計されている限り、それを行うことは絶対に賢明です。複数のインスタンスの代わりに1つのインスタンスを持つことでメモリを節約できるだけでなく、共有データを介して通信しようとすると、絶対に必要なことがあります。

間違いなくスレッド化が厄介なところがあるので、注意深く行う必要がありますが、スレッドシステム自体の観点からは、2つのスレッドがrunのメソッドを呼び出すことは全く問題ありません。単一のRunnableインスタンス。

8

は問題ではありません複数のインスタンスを使用して、任意のインスタンスの状態を持っていません。 Runnableインスタンスが状態の保存を開始するときには注意が必要です。

public class Main implements Runnable { 
    volatile int i; 
     public void run() { 
     for (i = 0; i < 100; i++) { 
      System.out.println(i); 
     } 
    } 

    public static void main(String[] args) { 
     Main a = new Main(); 
     Thread t1 = new Thread(a); 
     Thread t2 = new Thread(a); 
     t1.start(); 
     t2.start(); 
    }   
} 

printedは何が得られますか?スレッド間で状態を共有する必要がある場合は、java.util.concurrentのクラスを使用することをお勧めします。それらは主にマルチスレッドの専門家(Doug Lea、著者:Concurrent Programming in Java)によって書かれ、多くの人がテストしました。心を傷つけないでください。 :)

+0

woo、そのすべてが台無しになった。とても興味深い –

7

実行可能ファイルの同じインスタンスで2つのスレッドを初期化するのは悪いプログラミングですか?

特に指定しない。ただし、インスタンスにインスタンスフィールドがある場合は、スレッドによるフィールドへのすべてのアクセスが適切に同期されていることを確認する必要があります。これによりコードが複雑になります。

実行可能ファイルの別々のインスタンスで初期化するのとどのような違いがあり、実行可能ファイルの同じインスタンスに対してメモリ位置を共有することは、パフォーマンスと関係がありますか?

Runnableは、インスタンスデータを大量に保持していない限り、複数のスレッド間でRunnableインスタンスを共有することにより、保存されたメモリは...軽微であります。 (それがないなら、チャンスはこのインスタンスが非共有可能にするということです。)


あなたHクラスは、共有インスタンスが安全である例であるが、メモリの節約は軽微で無意味であるから。

0

Stephenのコメントに基づいて簡単に理解できるように、インスタンスへのアクセスの影響について以下のプログラムブロックを追加しました(インスタンスフィールドが存在しないオブジェクトは、プラットフォームに応じて約8〜16バイトを占めます) Runnableの同じインスタンスを持つ非同期ブロックからの変数は、予期しない結果を表示します。

public class SynchronizedInstanceMethod implements Runnable{ 

private int counter; 

public SynchronizedInstanceMethod(int counterValue){ 
    this.counter = counterValue; 
} 

private synchronized void displayMessage(){ 
    System.out.println(" Display Message "); 
} 

private void modifyCounter(){ 
    this.counter++; 
    System.out.println("Value -- "+ this.counter); 
} 

@Override 
public void run() { 
    this.displayMessage(); 
    this.modifyCounter(); 
} 

public static void main(String[] args) { 
    SynchronizedInstanceMethod instance = new SynchronizedInstanceMethod(5); 
    new Thread(instance).start(); 
    new Thread(instance).start(); 
} 
} 
関連する問題