2

スレッドが実行を開始する順序を教えてもらえますか? 私は次のコードを書きました

class NewThread implements Runnable {
    Thread t;
    NewThread() {
        //creating a second thread.
        t=new Thread(this,"Demo Thread");
        System.out.println("Child Thread:"+t);
        t.start();
    }

    public void run() {
        try {
            for(int i=0;i<5;i++) {
                System.out.println("Child Thread:"+i);
                Thread.sleep(3000);
            }
        } catch(Exception e) {
            System.out.println(e.getLocalizedMessage());
        }
        System.out.println("Exiting Child Thread");
    }
}

この

public class ThreadDemo {
    public static void main(String args[]) {
        new NewThread();
        try {
            for(int i=0;i<5;i++) {
                System.out.println("Main Thread:"+i);
                Thread.sleep(3000);
            }
        } catch(Exception e) {
            System.out.println(e.getLocalizedMessage());
        }
        System.out.println("Exiting Main Thread");
    }
}

このコードを実行すると、さまざまな出力セットが得られます。

Child Thread:Thread[Demo Thread,5,main]
Main Thread:0
Child Thread:0
Child Thread:1
Main Thread:1
Main Thread:2
Child Thread:2
Main Thread:3
Child Thread:3
Main Thread:4
Child Thread:4
Exiting Main Thread
Exiting Child Thread

もう一つ、

Child Thread:Thread[Demo Thread,5,main]
Main Thread:0
Child Thread:0
Child Thread:1
Main Thread:1
Child Thread:2
Main Thread:2
Child Thread:3
Main Thread:3
Child Thread:4
Main Thread:4
Exiting Child Thread
Exiting Main Thread

なぜこれが起こっているのですか?スレッドの順序が同じになることはありませんか?? 誰かがスレッドの基本と例へのポインタを私に与えることができれば、それは素晴らしいことです. PS: 私はスレッドが初めてで、これが私の最初のスレッド プログラムです。前もって感謝します。

4

3 に答える 3

8

このコードを実行すると、さまざまな出力セットが得られます。

これは予期されることです。順序は定義されておらず、スレッドが実行を開始し、OS によるスレッド スケジューリングの対象となるため、競合状態の対象となります。

マルチスレッド アプリケーションを作成するすべての理由は、スレッドが非同期であり、速度上の理由から別のプロセッサで実行されるためです。特定の出力順序を保証するために、ロックなどを使用してスレッド間で同期できますが、パフォーマンスが低下し、スレッドをフォークする理由全体が減少します。

于 2012-06-18T15:24:06.443 に答える
0

競合状態が発生しました。

マルチスレッドの複雑さの 1 つに出くわしました。特定の順序で処理する必要があるコードがある場合は、そのコードを「ロック」するか、そのコード内の変数を「揮発性」として宣言する必要があります。「デッドロック」と「競合状態」の Google 検索を実行します。

于 2012-06-18T15:25:47.517 に答える
0

暗黙の順序はありません。注文が必要な場合は、キューの深さ 1 で ExecutorService を使用します。

于 2012-06-18T15:26:41.790 に答える