2016-10-21 8 views
0

私は次のコードを持っていますメソッド変数の寿命がメソッド/スレッド内で開始される

パッケージテスト;私は、コードを実行すると、このコードでは

public class TestRun implements Runnable { 

    String message = new String("1111"); 

    public void run() { 


     this.message="this is my message"+Thread.currentThread().getName(); 

     for(int i=0; i<10; i++) 
     { 
      try { 
       Thread.sleep((new Double(Math.random()*10000 +1)).longValue()); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     System.out.println(i +"this is message from thread" + Thread.currentThread().getName() +" ====> " + message); 
     } 
    } 

    public static void main(String args[]) throws InterruptedException { 

     (new Thread(new TestRun())).start(); 
     Thread.sleep((new Double(Math.random()*10000 +1)).longValue()); 
     (new Thread(new TestRun())).start(); 
     Thread.sleep((new Double(Math.random()*10000 +1)).longValue()); 
     (new Thread(new TestRun())).start(); 

    } 
} 

、私は最後のスレッドがメッセージ文字列を上書きすると、すべてのスレッドが(最後の初期化)同じメッセージの印刷を開始すべきであることを期待していた、しかし、それぞれのスレッドが値を保つようですそれ自身のメッセージ変数のために、それを印刷してください。ここで私の理解は間違っていますか?

+2

ご理解のように固定された量のために寝る必要がありますが、あなたもまだスレッドを見てすべきではないように間違っています。 – Kayaman

+0

あなたが探している振る舞いは、 'virtual'と' static'キーワードを 'message'の宣言に追加することで実現しますが、これは何かであり、私たちは通常**不要です。 –

+1

私は@Kayamanと一緒です。それぞれのスレッドが独自のメソッドを出力する理由は、 'Classes'チュートリアルで扱う必要があります。このチュートリアルでは、インスタンス変数とクラスインスタンスについて教えています。ここでの質問に言い換えると、一般に「クラスの各インスタンスはインスタンス変数の値を保持するのはなぜですか?」という基本的な質問です。 – SomeJavaGuy

答えて

0

オブジェクトを3つ作成し、各オブジェクトには独自のフィールドがあります。これはオブジェクトに関する基本的な概念であり、複数のスレッドを扱うなどの高度なトピックではありません。スレッド間でデータを共有したい場合は、スレッドセーフな共有オブジェクトを使用することをお勧めします。例えば

AtomicReference<String> message = new AtomicReference<>(); 
new Thread(new TestRun(message))).start(); 
Thread.sleep(200); 
new Thread(new TestRun(message))).start(); 
Thread.sleep(200); 
new Thread(new TestRun(message))).start(); 

ところであなただけThread.sleep(100);

関連する問題