Java 有人能解释这两个线程的输出吗?

Java 有人能解释这两个线程的输出吗?,java,multithreading,Java,Multithreading,输出 起始线程 连接 输入值: 螺纹加工 主要成品 public class Join1 { public static void main(String[] args) { Thread t = new Thread() { public void run() { System.out.print("EnterValue:"); try { S

输出

起始线程

连接

输入值:

螺纹加工

主要成品

public class Join1 {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                System.out.print("EnterValue:");
                try {
                    System.in.read();
                } catch (Exception ex) {}
                System.out.println("Thread Finished.");
            }
        };
        System.out.println("Starting Thread");
        t.start();
        System.out.println("Joining");
        try {
            t.join();
        } catch (Exception ex) {}
        System.out.println("Main Finished.");
    }
}
输出

起始线程

输入值:

禁止加入

主要成品

public class Join1 {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                System.out.print("EnterValue:");
                try {
                    System.in.read();
                } catch (Exception ex) {}
                System.out.println("Thread Finished.");
            }
        };
        System.out.println("Starting Thread");
        t.start();
        System.out.println("Joining");
        try {
            t.join();
        } catch (Exception ex) {}
        System.out.println("Main Finished.");
    }
}
3(输入)

螺纹加工


我不明白一些输出的顺序。例如,在Join2中,为什么在您输入值之前它会在main中输出完成的行?

给出的两个示例中唯一的区别是在线程开始后使用
t.start()调用的方法

Join1.java调用
Thread.join()
,文档中说它“等待这个线程死亡”。因此,只有当线程的run方法完成时(在
System.in.read()
完成之后),才会执行“Main finished.”打印

Join2.java调用
Thread.sleep(2000)
,将线程暂停2000毫秒。尝试注释该行并查看结果。此外,请注意,程序在打印“Main Finished”后没有退出。线程仍在等待输入

TLDR

Thread.join()
使主暂停,直到该线程完成


Thread.sleep(2000)
在继续之前仅暂停main 2秒,另一个线程继续运行。

给出的两个示例中唯一的区别是在线程启动后使用
t.start()调用的方法。

Join1.java调用
Thread.join()
,文档中说它“等待这个线程死亡”。因此,只有当线程的run方法完成时(在
System.in.read()
完成后),才会打印“Main finished.”

Join2.java调用
Thread.sleep(2000)
,将线程暂停2000毫秒。试着把这句话注释出来,看看结果如何。此外,请注意,程序在打印“Main Finished”后没有退出。线程仍在等待输入

TLDR

Thread.join()
使主暂停,直到该线程完成


Thread.sleep(2000)
仅暂停main 2秒,然后继续,另一个线程继续运行。

将线程视为并发执行。当主线程从.start()返回时,新线程可以自由继续,好吗。但是在Join2中,您没有告诉主线程等待线程t完成。因此,在2秒钟内,它将超越睡眠状态。

将线程视为并发执行。当主线程从.start()返回时,新线程可以自由继续,好吗。但是在Join2中,您没有告诉主线程等待线程t完成。因此,在2秒钟内,它将经过睡眠。

在示例2中,什么阻止
main
完成?因为线程不阻止主程序,它们位于不阻止的独立线程上。此外,我强烈建议不要吞咽异常(
catch(Exception ex){}
)。您至少应该执行
例如printStackTrace()
。这甚至可能导致你的问题(我们无法知道)。这是一份教师笔记。我只是想知道为什么输出的顺序是is@JohnBanter我建议你研究一下线程是什么,它们是如何工作的。我在最后的评论中告诉过你为什么。把每个线程看作是它自己独立的子程序,你所做的线程不会阻止主线程完成。因此,它将在主线程上完成,并等待您创建的线程的输入。在示例2中,是什么阻止了
main
的完成?因为线程不阻止主程序,所以它们位于不阻止的独立线程上。此外,我强烈建议不要接受异常(
catch(Exception ex){}
). 您至少应该执行
例如printStackTrace()
。这甚至可能导致你的问题(我们无法知道)。这是一份教师笔记。我只是想知道为什么输出的顺序是is@JohnBanter我建议你研究一下线程是什么,它们是如何工作的。我在最后的评论中告诉过你为什么。把每个线程看作是它自己独立的子程序,你所做的线程不会阻止主线程完成。因此,它将在主线程上完成,并等待您创建的线程的输入。Re,“…暂停线程”(或“阻止线程”,或“睡眠(原文如此)线程”,等等)。对于尚未完全掌握概念的新手来说,其中一些词是绊脚石。有时,如果你说,“
Thread.sleep(2000)
什么都不做,只等两秒钟。”或者“
t.join()
什么都不做,只等Thread
t
完成。”后者特别有用,因为许多新手从
t.join()的某个地方得到了错误的想法
对线程执行一些操作
t
.Re,“…暂停线程”(或“阻止线程”或“睡眠(原文如此)线程”等)。对于尚未完全掌握概念的新手来说,其中一些词是绊脚石。有时,如果你说,“
Thread.sleep(2000)
什么都不做,只等两秒钟。”或者“
t.join()
什么都不做,只等Thread
t
完成。”后者特别有用,因为许多新手从
t.join()的某个地方得到了错误的想法
对线程
t
执行某些操作。