我对理解此代码有疑问。我只有几个小时的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的实例。Child thread: Thread[Demo Thread,5,main]
public void run()
(我错了吗?)在public void run()
中,我认为我应该得到一个输出Child Thread 5
,但我得到Main Thread 5
。我想知道为什么 ??
有人帮我吗?提前谢谢。
答案 0 :(得分:2)
t.start()
创建一个新主题,并从中调用run()
。此时,有两个独立运行的线程:一个调用start()
,另一个调用新线程。原始线程从构造函数返回,然后在main()
方法中开始执行循环。
由于两个线程是独立的,因此无法保证哪个线程首先会调用System.out.println
。在您给出的示例输出中,原始线程首先打印出来。反过来可能很容易发生。
顺便说一句,如果您是Java新手,我建议您在进入线程之前学习语言的基础知识。您的问题中没有任何内容表明您感到困惑,但线程是一个相对高级的主题,并且在您达到目标之前,值得对一般语言行为感到满意,IMO。这样你就可以确信你看到的任何奇怪行为都是由于线程而不是误解语言的其他部分。