0

このコードを理解するのに問題があります。私は Java について数時間の知識しかありません。

コードは次のとおりです。

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

   // This is the entry point for the second thread.
   public void run() {
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
     } catch (InterruptedException e) {
         System.out.println("Child interrupted.");
     }
     System.out.println("Exiting child thread.");
   }
}

public class ThreadDemo {
   public static void main(String args[]) {
      new NewThread(); // create a new thread
      try {
         for(int i = 5; i > 0; i--) {
           System.out.println("Main Thread: " + i);
           Thread.sleep(100);
         }
      } catch (InterruptedException e) {
         System.out.println("Main thread interrupted.");
      }
      System.out.println("Main thread exiting.");
   }
}

そして、これがその出力です:

Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.

これが私の質問です。

コードがたどるパターンを理解したい。私によると、

  • まず、プログラムはmain()関数の実行を開始する必要があります。そのため、NewThread のインスタンスを初期化する必要があります。
  • 次に、NewThread コンストラクターに入り、次のように記述します。Child thread: Thread[Demo Thread,5,main]
  • その後 t.start() が来るので、プログラムを実行する必要がありますpublic void run()(AM I WRONG HERE ?? )

ではpublic void run()、出力を取得する必要があったと思いますChild Thread 5が、代わりに を取得しMain Thread 5ました。なぜだろう??

私を助けてくれる人はいますか?? 前もって感謝します。

4

1 に答える 1

2

t.start()新しいスレッドを作成し、run()そこから呼び出します。その時点で、独立して実行されている 2 つのスレッドがあります。 を呼び出したスレッドstart()と新しいスレッドです。元のスレッドがコンストラクターから戻り、main()メソッドでループの実行を開始します。

2 つのスレッドは独立しているため、どちらのスレッドがSystem.out.println最初に呼び出しに到達するかは保証されません。あなたが与えたサンプル出力では、元のスレッドが最初に印刷されることがあります。ただし、逆の場合は簡単に発生する可能性があります。

余談ですが、Java を初めて使用する場合は、スレッド化を始める前に言語の基礎を学ぶことをお勧めします。あなたの質問にはあなたが混乱していることを示すものは何もありませんが、スレッド化は比較的高度なトピックであり、そこに到達する前に一般的な言語の動作に慣れておく価値があります. そうすれば、実際に見られる奇妙な動作はスレッド化によるものであり、言語の他の部分の誤解によるものではないことを確信できます。

于 2013-10-14T15:40:17.347 に答える