2013-07-31 26 views
0

这里是在Java的示例程序从tutorials pointmulithreading在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. 

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

+0

我看到你没有应用任何线程同步选项。所以在启动两个不同的线程后,'它不在你的手上'来控制哪个线程执行时,但有一些同步选项,如延迟,优先级和join()也许你可以达到一定数量的控制..不断学习.. – Dreamer

回答

3

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

线程不必任何形式的同步默认情况下,可以在与他们的执行可能交织任何顺序运行。您可以获取锁并使用这些锁来确保顺序,例如,如果主线程在启动子线程之前获取锁,让子线程等待获取锁,并让主线程在完成任务后释放锁。

+0

但它的情况下,总是主线程在子线程之前运行。如果它们可以以任何顺序运行,则在某些情况下,子线程应该先运行。我不明白为什么会发生这种情况 –

+0

@ShikharSubedi在不同的系统负载下多次运行它。没有保证真的。这很可能是操作系统在主线程的指令中打包成一个时间片,或者是创建一个新线程导致它被延迟到主线程完成之后才能启动的开销。如果您为每个线程添加更多实质性任务,您会更清楚地看到该行为。 – hexafraction

1

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

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