Javaでマルチスレッドを勉強していて、次のコードを書きました。
public class MulThread extends Thread
{
public void run()
{
for(int i=1; i<5;i++)
{
try
{
Thread.sleep(500);
}
catch(Exception e){ System.out.println(e);}
System.out.println(i);
}
}
public static void main(String [] args)
{
MulThread t1 = new MulThread();
MulThread t2 = new MulThread();
MulThread t3 = new MulThread();
t1.start();
t1.run();
t2.start();
t2.run();
t3.start();
t3.run();
}
}
私はこれについて何人かの友人と議論し、出力は完全に混乱するべきであるという結論に達しました。しかし、何らかの理由で、コンパイラは常に次の出力を生成します。
1
1
2
2
3
3
4
4
1
1
2
2
3
3
4
4
1
1
2
2
3
3
4
4
スレッドがスケジューラに到達したときに、ここで何が起こっているのか正確に説明できますか? ランダムなスープでそれぞれ 6 回繰り返される 1、2、3、および 4 の出力が混乱しないのはなぜですか?
私のメンターの何人かは、これは単なる偶然であり、私の OS か何かに依存すると言っていますが、私はそれについては懐疑的です。コードを 10 回以上実行しましたが、常に同じ結果が生成されます。
を呼び出すt1.start()
と、セカンダリ スレッドが開始され、run()
メソッドが実行されます。を呼び出すとt1.run()
、run()
メイン スレッドでメソッドが実行されます。
これは、ループが終了したt2.start();
後にのみ実行されることを意味しt1.run();
、この時点で によって作成されたスレッドt1.start()
はすでに終了しています。
run()
メソッドのループには大きなスリープ (0.5 秒) が含まれているため、t1.start()
(セカンダリ スレッドで実行される) とt1.run()
(メイン スレッドで実行される) の出力がインターリーブされる可能性が非常に高くなります (スリープは最初のスレッドがスリープしている間に、2 番目のスレッドが制御を取得して次の出力を出力するのに十分な時間です)。
スリープ期間を短縮すると、おそらく異なる出力が表示されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加