2016-06-24 7 views
-3

私はJavaについて学んでいますが、それは癖です。何が起きてる?JavaクラスはRunnableを実装し、新しいスレッドを作成して奇妙な結果を返します。どうして?

public class myThread implements Runnable { 

    String msg = "yes"; 

    public void run() { 
     this.msg = "No"; 
    } 

    public static void main(String[] args) { 
     myThread one = new myThread(); 
     (new Thread(one)).start(); 

     for (int i = 0; i < 10; i++) { 
      System.out.println(one.msg); 
     } 
    } 
} 

結果:はい ません ない ない ない ない ない ない ない ない

なぜ「はい」、それは「にそれを設定としてFIRST結果の戻りはありません'?

+1

'println'から' print'に行くと(バッファがフラッシュされず、I/Oが据え置かれるように)変更されますか? – Thilo

答えて

3

start()は新しいスレッドを開始してmsgを修正するのに少し時間がかかったため、スレッドの開始前にループの繰り返しが完了しました。最初の反復の後、msgはスレッドによって変更され、Noが表示されます。

3

新しいスレッドは、メインスレッドの実行中にバックグラウンドで実行されます。

2つの間に同期がないため、バックグラウンドスレッドは、完全に指定されていない1点で値を「はい」から「いいえ」に変更します。その間、メインスレッドは、この時点で表示されている内容を印刷します。

私が正しくJavaのメモリモデルを理解していれば、任意の​​、volatileまたは他の同期構文が存在しない場合に、でも、メインスレッドが他のスレッドの変更を見ることすべてに保証するものではありません。

0

新しいThreadを作成し、start()メソッドを呼び出して実行を開始しました。しかし、JVMはスレッドがいつ実行されるかを決定します。プログラムを実行するたびに、異なる結果が得られます。

最初にyesとなり、Noとなります。メインスレッドは最初にyesを印刷し、msgの値を変更したJVMが開始した子スレッドを返してから、制御がメインスレッドに戻り、ループの最後までNoとしてmsgを出力しました。

+2

"プログラムを実行するたびに異なる結果が得られます。" - 本当じゃない。私は100倍に走り、毎回同じ結果を返しました。 – Jeremy

関連する問題