2017-09-03 8 views
-3

JavaマルチスレッドでisAlive()を使用するコードを以下に示します。 表示されている出力シーケンスを解釈できません。私が期待している出力はr1 r1 true true r2 r2
誰もがこれを手伝ってくれますか?javaマルチスレッドでisAlive()を実行

public class MyThread extends Thread 
{ 
    public void run() 
    { 
     System.out.println("r1 "); 
     try { 
       Thread.sleep(200); 
     } 
     catch(InterruptedException ie) { } 
     System.out.println("r2 "); 
    } 
    public static void main(String[] args) 
    { 
     MyThread t1=new MyThread(); 
     MyThread t2=new MyThread(); 
     t1.start(); 
     t2.start(); 
     System.out.println(t1.isAlive()); 
     System.out.println(t2.isAlive()); 
    } 
} 

出力: R1 真 真 R1 R2 R2

+4

いいえ、いけません。あなたは2つのスレッドを開始しており、出力はスケジューリングやその他のものに完全に依存しています。あなたが特定の出力を探しているなら、このコードはそれを与えません。それはあなたがそれを実行する時間の間に変更することができます。 – Kayaman

+0

あなたは、出力があなたが期待するものと思われるのはなぜですか? –

+0

あなたは本当になぜアウトプットがあなたが思っていると思うと思うかを説明していません。 Oracleが提供する同時実行チュートリアル・ドキュメントを見直し、まだ不明な点がある場合は、問題を解決することをお勧めします。 https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html – pvg

答えて

-2

両方のスレッドが実行されている場合、出力

r1 
true 
true 
r1 
r2 
r2 

は完全に合理的ですが、そのうちの一つ(おそらくではなく、確かに第2のもの)は稼働し始めたが、まだSystem.out.println("r1")に達していない。

これ以上の同期構造がなければ、これは「競合条件」の簡単な例です。

競合状態またはレースハザード出力が他の制御不能な事象の 順序やタイミングに依存している電子、 ソフトウェア、またはその他のシステムの動作です。

https://en.wikipedia.org/wiki/Race_condition

NB:プリントの一部を失うような結果は、少なくとも理論的に可能であるので、スレッドセーフであることが保証されていない(System.outでのインスタンスがあること)PrintStream

+0

System.outはスレッドセーフであると思われますが、最後の段落のポイントを取得しません。 –

+0

@NathanHughes確かにそうだね。しかし、私は保証を見つけることができません。 – Persixty

+0

これはちょうど誤った情報であり、 'println()'とその変形はスレッドセーフであるため、異なる呼び出しから混合出力を得ることはありません。 'public void println(文字列x){ は同期しました{ print(x); newLine(); } } ' –

関連する問題