-3

次の multiThreading コードを複数回実行しようとすると、出力は前のものと同じではありません。それは JVM の動作のためですか、それとも他の理由かもしれません。誰か助けてください。

program:


package example.thread.com;

class MyThread1 implements Runnable {
    Thread t;

    MyThread1(String s) {
        t = new Thread(this, s);
        t.start();
    }

    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("Thread Name  :"
                    + Thread.currentThread().getName());
            try {
                Thread.sleep(2000);
            } catch (Exception e) {
            }
        }
    }
}


public class RunnableThread1 {
    public static void main(String args[]) {
        System.out.println("Thread Name :" + Thread.currentThread().getName());
        MyThread1 m1 = new MyThread1("My Thread 1");
        MyThread1 m2 = new MyThread1("My Thread 2");
    }
}

出力:初めて実行した場合

Thread Name :main
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 2

出力: 2 回目の実行の場合

Thread Name :main
Thread Name  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 2

出力: 3 回目の実行の場合

Thread Name :main
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 1

このように提案してください.....

4

6 に答える 6

3

これがまさにこの例のポイントです。これは、スレッドが気まぐれにスケジュールされ、出力が順番どおりに行われるとは限らないことを示しています。

他のプログラミング言語やシステムでは、次のような破損した出力が期待されることは不合理ではありません。

Thread Name :main
Thread Name  :My Thread 1
Thread NThread Name  :My Thread 2ame  :My Thread 2
Thread Name  :My Thread 1
Thread Name  :My Thread 2
Thread Name  :My Thread 1
ThreaThread Name  :My d Name  :My ThrThread 2ead 1
Thread Name  :My Thread 2
Thread Name  :My Thread 1
于 2013-02-06T11:42:22.837 に答える
1

並行して実行され、それらの名前を数回出力する 2 つのスレッドがあります。多くの要因に応じて、スレッド 1 が最初に開始するか、スレッド 2 になる可能性があります。これは多かれ少なかれランダムになります。

その場合、スリープは非常に正確な解像度を持たないため、1 つのスレッドが 2001 ミリ秒スリープし、もう 1 つのスレッドが 1999 ミリ秒スリープする場合があります。これもかなりランダムです。

注: コンストラクターからスレッドを開始しないでください。次のようにすることをお勧めします。

MyThread1 m1 = new MyThread1("My Thread 1");
new Thrad(m1).start();

MyThread1 からスレッドへのすべての参照を削除します - ちなみに、MyRunnable1 の名前を変更して一貫性を持たせることができます。

于 2013-02-06T11:41:20.763 に答える
0

表示される効果は、JVM の動作の結果の一部にすぎません。JVM はスレッドを作成して開始するだけです。オペレーティング システムは、どのスレッドがどのプロセッサでいつ実行されるかを決定します。スレッドは、プロセッサの使用をめぐって互いに競合するだけでなく、コンピュータが実行しているすべての作業と競合します。

スレッドがスリープ状態になると、プロセッサを使用できる実行可能なスレッドではなくなります。スリープ時間が終了すると、実行可能状態に戻り、プロセッサの使用をめぐって競合します。その後しばらくすると、オペレーティング システムはそれをプロセッサ上で実行するスレッドとして選択し、計算を続行します。プロセッサが終了するか、スリープするか、何か他のことを待たなければならないか、オペレーティング システムが別のスレッドの順番であると判断するまで、プロセッサを保持します。

2 つのスレッド間の順序が実行ごとに同じであると期待する理由はありません。一貫した結果が得られるマルチスレッド プログラムを作成するには、ある程度の労力が必要です。

マルチスレッド プログラミングに関するいくつかの基本的なチュートリアルから始めることをお勧めします。このテーマについてさらに深く学ぶ準備が整ったら、Java Concurrency in Practiceをお勧めします。

于 2013-02-06T12:26:16.600 に答える
0

JAVA のマルチスレッドと同時実行の概念について読むべきだと思います。最初に概念を読み、次にコードを実践することは常に良い習慣です

于 2013-02-06T11:43:58.497 に答える
0

それはJVMの振る舞いによるものでしょうか...

はい。Java スレッド化 (および他の言語のスレッド化) の多くの側面は非決定論的です。つまり、予測することはできず、制御できない要因に応じて実行ごとに異なります。

そのため、マルチスレッド アプリケーションを作成するときは、これらの非決定論のポイントの 1 つに正確性が依存していないことを確認する必要があります。

この場合、非決定論は多くのソースに由来します。例えば:

  • 呼び出し時に、呼び出しが戻る前に実際に命令の実行を開始するthread.start()かどうかは指定されていません。thread

  • を呼び出すときthread.sleep(2000)、スレッドがスリープする実際の長さは少なくとも2000 ミリ秒です。

  • 実行可能なライブ スレッドが多数ある場合、どのスレッドが実行されるか (またはいくつ実行されるか)予測することはできません。それは OS レベルのスレッド スケジューラ次第です。

于 2013-02-06T12:01:52.950 に答える
0

MyThread1 の run() メソッドは、同時に 2 つの異なるスレッドで実行されています。各スレッドは 5 までカウントされ、カウントごとにその名前が表示されます。出力への書き込み操作はアトミックです。つまり、一度に 1 つのスレッドだけが書き込みを実行できます。したがって、スレッドが書き込みの準備ができているが、他のスレッドが最初にそこに到達した場合、書き込みを開始する前に、他のスレッドが書き込みを完了するまで待機する必要があります。どのスレッドが最初にそこに到達するかを知る方法はないため、毎回異なります。

2 人が紙切れに自分の名前を 5 回書くように言われたとします。紙は 1 枚しかなく、共有する必要があります。自分の名前を書くために、彼らはまず紙切れを手に入れます。他の人がそれを持っている場合、彼らは待ちます。名前を一度書き終えると、紙切れを手放します。両方の人が再び自分の名前を書く準備ができていて、誰も紙切れを持っていない場合、誰が最初にそれを手に入れるかはランダムなチャンスです.

そのため、毎回結果が異なります...

于 2013-02-06T12:04:23.993 に答える