线程启动方法在运行返回之前返回

时间:2014-06-06 22:18:33

标签: java multithreading thread-sleep

当我运行程序时,我看到以下输出 -

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();
    }
}

3 个答案:

答案 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”行。线程与主方法协同工作而不是与它相反。