Java 线程启动方法在运行返回之前返回
当我运行我的程序时,我看到下面的输出-Java 线程启动方法在运行返回之前返回,java,multithreading,thread-sleep,Java,Multithreading,Thread Sleep,当我运行我的程序时,我看到下面的输出- 键入某物 你好 你好 您好- 我的问题是为什么打字语句会被打印出来?start()调用run方法,因为run方法中有一个无限循环,所以它永远不会从run方法中出来。Thread.sleep(100)是导致这种情况的原因吗?有人能解释一下吗?我显然错过了一些简单的东西。这是密码- public class Processor extends Thread { private boolean running = true; public void run()
键入某物
你好
你好
您好
-
我的问题是为什么打字语句会被打印出来?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();
}
}
线程的全部意义在于允许并行运行代码。因此,就像您可以在音乐播放器仍在运行并播放您喜爱的歌曲时启动Excel一样,“Hello循环”与程序的其余部分(即“键入某物”部分)并行执行。为了保持这种类比,您的
proc1.start()
相当于启动Excel
对于深入的解释,您可以阅读或查看,或者,对于更技术性的介绍,有
快速“买家注意”:多线程和并发是非常复杂的概念,可能导致程序中各种难以跟踪的错误。如果程序中的两个线程同时访问
a
,即使像a=a+1
这样愚蠢的事情也可能失败。你可能需要做大量的阅读和实验 线程的全部意义在于允许并行运行代码。因此,就像您可以在音乐播放器仍在运行并播放您喜爱的歌曲时启动Excel一样,“Hello循环”与程序的其余部分(即“键入某物”部分)并行执行。为了保持这种类比,您的proc1.start()
相当于启动Excel
对于深入的解释,您可以阅读或查看,或者,对于更技术性的介绍,有
快速“买家注意”:多线程和并发是非常复杂的概念,可能导致程序中各种难以跟踪的错误。如果程序中的两个线程同时访问a
,即使像a=a+1
这样愚蠢的事情也可能失败。你可能需要做大量的阅读和实验 打印“键入某物”的原因是,通过调用proc1.start()
,您正在启动另一个线程。此线程
与主线程同时运行。因此,实际上这段代码有两个线程。主线程负责打印“键入某物”,处理器thread
负责每100秒打印一次“Hello”
调用proc1.start()
时,代码行不会阻塞在该行上。相反,程序将调用该行,启动处理器线程,然后继续运行main。打印“键入某物”的原因是,通过调用proc1.start()
,您正在启动另一个线程。此线程
与主线程同时运行。因此,实际上这段代码有两个线程。主线程负责打印“键入某物”,处理器thread
负责每100秒打印一次“Hello”
Thread.sleep(100);
调用proc1.start()
时,代码行不会阻塞在该行上。相反,程序将调用该行,启动处理器线程,然后继续运行main
Thread.sleep(100);
需要删除。如果只是运行线程,编译器将没有时间在线程开始无限循环之前打印“type something”行。线程与主方法协同工作,而不是与之对抗
需要删除。如果只是运行线程,编译器将没有时间在线程开始无限循环之前打印“type something”行。线程与主方法协同工作,而不是与之对抗 同意,1+。另外,作为一个侧rec,可能运行应该是volatile
.2。一个用于主程序,一个用于“Hello循环”。同意,1+。另外,作为一个侧rec,可能运行应该是volatile
.2。一个用于主程序,一个用于“Hello循环”。解释得很好。谢谢,解释得很好。谢谢。你的标题表达了你的想法,不正确的,应该发生的,而不是实际发生的,你的标题表达了你的想法,不正确的,应该发生的,而不是实际发生的,不是真的!您的计算机有多个内核,可以同时执行线程。即使您的计算机只有一个处理器,您的操作系统也会自动对所有不同线程的执行进行时间切片,以达到相同的效果。另外,如果您查看上面的输出,在第一个“Hello”之前会打印“Type something”,因此线程。sleep
甚至还没有发生。不是真的!您的计算机有多个内核,可以同时执行线程。即使您的计算机只有一个处理器,您的操作系统也会自动对所有不同线程的执行进行时间切片,以达到相同的效果。另外,如果您查看上面的输出,在第一个“Hello”之前会打印“typesomething”,因此Thread.sleep
甚至还没有出现。