Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程启动方法在运行返回之前返回_Java_Multithreading_Thread Sleep - Fatal编程技术网

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
甚至还没有出现。