LEV:
私は、次のシナリオで何が起こるか疑問に思って:
二つのスレッドが作成されます。
Thread t1 = new Thread();
Thread t2 = new Thread();
スレッドが、その後.start()メソッドを呼び出して、単なる文字列をプリントアウトし、これらの仮定します。
t1.start();
t2.start():
私の質問は、なぜこれらのスレッドが毎回一見ランダムな順序で印刷んでしょうか?私は、スレッドが同時に実行知っているだろうがt1
、常に前に完了していないt2
メイン処理の逐次実行に起因しますか?
カーン:
呼び出し開始()にThread
は必ずしも実行中のスレッドにはなりません、すぐ後に。他のものは、あなたの呼び出しの間に発生することが可能ですstart()
し、あなたのスレッドの最初の行run()
、実際に実行されて方法。そして、あなたは一度もrun()
実際には、他のものは中に、前に起こる、またはあなたの後ということも可能ですが、実行されているrun()
方法が終了します。
あなたの質問では、あなたが言った:「これらは単なる文字列をプリントアウトすると仮定」 -ここでの実装のrun()
ことをしているが:
public void run() {
System.out.println("my name is: " + getName());
}
それがいる可能性がありますので、t1
開始は最初に実行するために、それが実際に呼び出す前にSystem.out.println
、t2
そして、完成に実行し、実行することが許可されてt1
再開されました。
行動のこの種は、あなたのユースケースでは動作しない場合、あなたはどのようにして、あなたのスレッドが実行時に調整するための並行処理の保護のいくつかの種類を追加する必要があります。
更新:
スレッドの実行の予測不可能な順序を説明するために、数回このコードを実行し、出力を守ってください。
public class Example {
public static void main(String[] args) {
for (int k = 0; k < 10; k++) {
new TestThread(k).start();
}
}
}
class TestThread extends Thread {
private final int k;
TestThread(int k) {
this.k = k;
}
@Override
public void run() {
System.out.print(k + " ");
}
}
ここに私の地元のランの1からの出力は次のようになります。
7 0 1 5 4 6 3 2 8 9