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.

我很难理解为什么主线程在子线程之前执行。在程序中,您可以看到第一个 new NewThread() 被执行。NewThread 类实例化一个新线程并在新线程上调用 start() 函数,然后再调用 run() 函数。main 函数中的循环仅在创建新线程后出现。但是当程序运行时,主线程中的循环在子线程之前运行。请帮我理解。

4

2 回答 2

3

主线程中的循环在子线程之前运行。请帮我理解。

默认情况下,线程没有任何形式的同步,并且可以以任何顺序运行,它们的执行可能是交错的。您可以获取锁并使用它们来确保顺序,例如,如果主线程在启动子线程之前获取锁,让子线程等待获取锁,并让主线程在完成其任务后释放锁.

于 2013-07-31T13:56:20.703 回答
1

Thread.start()调度要运行的线程。之后,由 JVM(和操作系统)负责调度。线程的运行方式取决于许多因素,包括您拥有的 CPU/内核数量、操作系统、优先级等。

如果您需要线程以特定顺序运行,彼此等待等,那么您必须使用提供的线程工具(同步,锁等)否则它是完全任意的。

于 2013-07-31T13:55:59.343 回答