基本的Java线程和可运行模式

时间:2013-10-14 15:37:51

标签: java multithreading runnable

我对理解此代码有疑问。我只有几个小时的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()(我错了吗?)

public void run()中,我认为我应该得到一个输出Child Thread 5,但我得到Main Thread 5。我想知道为什么 ??

有人帮我吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

t.start()创建一个新主题,并从中调用run()。此时,有两个独立运行的线程:一个调用start(),另一个调用新线程。原始线程从构造函数返回,然后在main()方法中开始执行循环。

由于两个线程是独立的,因此无法保证哪个线程首先会调用System.out.println。在您给出的示例输出中,原始线程首先打印出来。反过来可能很容易发生。

顺便说一句,如果您是Java新手,我建议您在进入线程之前学习语言的基础知识。您的问题中没有任何内容表明您感到困惑,但线程是一个相对高级的主题,并且在您达到目标之前,值得对一般语言行为感到满意,IMO。这样你就可以确信你看到的任何奇怪行为都是由于线程而不是误解语言的其他部分。