1

次のコードを使用します。

package myapp;

class Runner extends Thread {
    public void run(){
        for(int i = 0; i < 11; i++){
            System.out.println("Hello " + i);
        }

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public class Class1 {
    public static void main(String[] args){
        Runner t1 = new Runner();
        t1.start();

        Runner t2 = new Runner();
        t2.start();
    }
}

次の出力が得られます。

Hello 0
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Hello 6
Hello 7
Hello 8
Hello 9
Hello 10
Hello 0
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
Hello 6
Hello 7
Hello 8
Hello 9
Hello 10

私の出力は次のようになります:

Hello 0
Hello 0
Hello 1
Hello 1
Hello 2
Hello 2
Hello 3
Hello 3
Hello 4
Hello 4
Hello 5
Hello 5
Hello 6
Hello 6
Hello 7
Hello 7
Hello 8
Hello 8
Hello 9
Hello 9
Hello 10
Hello 10

何がうまくいかないのですか?私は Eclipse Standard/SDK Version: Kepler Release
Build id: 20130614-0229 、 jre7u25 、および jdk7u25 を使用しています。

4

3 に答える 3

2

最初の出力は正しく、期待しているものも正しいです。確率は 100 万回に 1 回です。

複数のスレッドがありますが、特定のスレッドが実行される可能性を予測することはできません。jvm(またはネイティブプログラムの場合はCPU)にディスパッチされると、そのjvmまで、どのスレッドをいつどのように実行する必要があるか。

最初の出力は正しい bcz です。コードが非常に小さいため、スレッドの切り替えが必要になる前にタスクが完了しています。それが、出力が介入されない理由です。>10000この概念を理解できるように、より多くの反復を試してみてください。または、コードを何度も実行してみてください。同じコードから別の出力が得られる可能性があります。

Ps:を最後の命令として保持してsleepも、実際には何の効果もありません。スレッドはほぼ寿命を終えており、死ぬまで待機させているだけだからです。

于 2013-08-03T18:26:28.353 に答える
1

2 つのスレッドの優先度が同じ場合、実行の順序は保証されず (同じプログラムを 2 回実行すると異なる結果が生じる可能性があります)、スレッド間で CPU をディスパッチするのはホストされているオペレーティング システムに依存します。

于 2013-08-03T18:26:56.340 に答える