当我运行程序时,我看到以下输出 -
Type something
Hello
Hello
Hello
-
我的问题是为什么Type something语句会被打印出来? proc1.start()调用run方法,并且由于run方法中存在无限循环,因此它永远不会出现在run方法中。 Thread.sleep(100)导致这个吗?有人可以解释一下吗?我在这里显然缺少一些简单的东西。这是代码 -
public class Processor extends Thread {
private boolean running = true;
public void run() {
try {
while (running) {
System.out.println("Hello");
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void shutdown() {
running = false;
}
public static void main(String[] args) {
Processor proc1 = new Processor();
proc1.start();
System.out.println("Type something");
Scanner scan = new Scanner(System.in);
scan.nextLine();
proc1.shutdown();
}
}
答案 0 :(得分:3)
原因"键入内容"打印是因为通过调用proc1.start()
,您正在开始另一个Thread
。此Thread
与主线程同时运行 。所以,实际上这段代码有2个线程。主线程负责打印"输入内容"处理器Thread
负责打印" Hello"每100秒。
当您致电proc1.start()
时,代码行在该行上不阻止。相反,程序会调用该行,启动Processor
Thread
,然后继续运行main。
答案 1 :(得分:2)
线程的重点是允许您并行运行代码。所以,就像你可以在音乐播放器仍在运行并播放你喜爱的音乐时启动Excel一样,你的“Hello循环”与你的程序的其余部分并行执行,即“输入内容”部分。为了保持这种类比,您的proc1.start()
相当于启动Excel。
要获得深入的解释,您可以阅读Java Thread class或查看此Java Multithreading Tutorial,或者为了更加技术性的介绍,有Lesson on Concurrency from the "official" Java tutorials。< / p>
快速“买家要小心”:多线程和并发是极其复杂的概念,可能导致程序中各种难以追踪的错误。如果程序中的两个线程同时访问a = a + 1
,即使像a
这样的愚蠢的事情也会失败。您可能需要进行相当多的阅读和实验。
答案 2 :(得分:-1)
Thread.sleep(100);
需要删除。如果你只是运行该线程,编译器将没有时间在线程开始其无限循环之前打印“type something”行。线程与主方法协同工作而不是与它相反。