0

このコードは Java で記述しましたが、出力が期待どおりにならない理由がわかりません。

リンゴとオレンジが散らかっていて、1つずつリストされていない理由を誰か説明できますか?

package first_experiment;

class Orange extends Thread{

    public void run (){  
        for ( int i=1 ; i<21 ; i++)
            System.out.println( i + " - Orange");
    }
}

class Apple extends Thread{

    public void run(){
        for (int i =1 ; i <11 ; i++)
            System.out.println( i + " - Apple");
    }
}

public class one{
    public static void main (String args[]){
        Thread O = new Orange();
        Thread A = new Apple();

        O.start();
        A.start();
    }
}
4

6 に答える 6

5

2 つのスレッドが同時に実行されます。それらがどの順序で出力されるかを決定するのは JVM 次第であり、順序が予測可能であることに依存することはできません。

于 2013-05-13T14:08:15.183 に答える
1

同時に実行される 2 つのスレッドを作成しています。実行の順序は不明です (両方の優先度が同じであるため)。が同期されていない場合PrintStream#println()、出力は次のようになります。

12 - - A ppOranlgee
// and so on
于 2013-05-13T14:09:23.517 に答える
0

Java のスレッドは、開始時に独立して実行されるプロセスです。開始されたスレッド コードの 1 行は、スレッド間の特定の実行順序なしで一度に実行されます。上記のコードは、コンソールの count - Orange と count - Apple にランダムに表示されます。

于 2013-05-13T14:38:33.010 に答える
0

結果を特定の順序で表示する場合は、ループで 1 つのスレッドを使用します。

複数のスレッドを使用する場合は、可能な限り任意の順序で開始および実行する必要があります。

あなたのスレッドは非常に短命であり、他のスレッドが開始する前に完了するまで実行されています。

ところで、あなたの PC はまばたきにかかる時間内に 1 億回の操作を実行でき、新しいスレッドの開始には時間がかかります。

于 2013-05-13T14:09:46.053 に答える
0

スレッドは、個別の独立した実行ストリームとして実行されます。最初の Orange が CPU 時間を取得する前に、いくつかの Apple をループする可能性があります。また、マルチプロセッサ システムを使用している場合は、両方を同時に実行することができます。

出力を調整したい場合は、wait() と notify() を使用する必要があります。

于 2013-05-13T14:09:47.500 に答える
-1

スレッドは任意の順序で開始できますが、System.out.println がスレッドへのアクセスを同期し、印刷のために次々に実行されるため、結果は乱雑になります。

完全にランダムな出力を表示するには、データをリストに保存し、後でリストの内容を出力します。

于 2013-05-13T14:23:34.890 に答える