2016-04-04 17 views
0
public class ThreadTest extends Thread { 
    public static void main(String[] args) { 
    new ThreadTest().start(); 
    for (int i = 0; i < 10; i++) { 
     System.out.format("%s %d\n", Thread.currentThread(), i); 
    } 
    } 
    public void run() { 
    for (int i = 0; i < 10; i++) { 
     System.out.format("%s %d\n", Thread.currentThread(), i); 
    } 
    } 
} 

を作成しているものの出力は次のようになります。スレッドは自分自身とメインスレッドで実行シーケンス

Thread[Thread-0,5,main] 0 
Thread[main,5,main] 0 
Thread[main,5,main] 1 
Thread[main,5,main] 2 
Thread[main,5,main] 3 
Thread[main,5,main] 4 
Thread[main,5,main] 5 
Thread[main,5,main] 6 
Thread[main,5,main] 7 
Thread[main,5,main] 8 
Thread[main,5,main] 9 
Thread[Thread-0,5,main] 1 
Thread[Thread-0,5,main] 2 
Thread[Thread-0,5,main] 3 
Thread[Thread-0,5,main] 4 
Thread[Thread-0,5,main] 5 
Thread[Thread-0,5,main] 6 
Thread[Thread-0,5,main] 7 
Thread[Thread-0,5,main] 8 
Thread[Thread-0,5,main] 9 

私は、スレッドが実行する順序について混乱しています。新しいThreadTest.startが実行されると、まずrun()メソッドが実行されます。しかし、なぜそれが0を出力し、メインスレッドを実行し続けた、あなたは私のために出力を説明することができますか?

ありがとうございます。

+5

スレッドスケジューラによってスレッド順序が決定されました。プログラマーではない。 –

+1

はどちらも並列に実行され、両方のループに 'Thread.sleep(1000);'を追加して結果を確認しようとします。 – Kaushal28

答えて

2

System.out.printlnは同期された方法であり、スレッドがロックを取得すると、再度ロックを取得することが優先されます。この場合、mainはロックを取得し、メインループが終了するまでロックを取得し続けます。これをもう一度実行すると、異なる順序で出力が得られる可能性があります。

+0

ああ、私はそれを得る。ありがとう、ピーター – codemonkey

関連する問題