java - 有人可以帮助解释这两个线程的输出吗?

标签 java multithreading

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 Join2 {
        public static void main(String[] args) {
            Thread t = new Thread() {
                public void run() {
                    System.out.println("EnterValue:");
                    try {
                        System.in.read();
                    } // thread blocked
                    catch (Exception ex) {}
                    System.out.println("Thread Finished.");
                }
            };

            System.out.println("Starting Thread");
            t.start();
            try {
                Thread.sleep(2000);
            } catch (Exception e) {}
            System.out.println("No Join");
            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() 使 main 暂停,直到该线程完成。

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

关于java - 有人可以帮助解释这两个线程的输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50011215/

相关文章:

python - 如何确定正在运行的当前进程是否是父进程?

java - tomcat 不选择 context.xml,但它被复制到 CATALINA_HOME> conf>Catalina>localhost

java - 瓷砖随着旋转从魔方中消失

java - Android 与 ReSTLet/JSON/Jackson 的兼容性

python - LED闪烁如何打发时间。 sleep RPI

c# - 如何在 ASMX Web 服务中一次限制一个调用者对特定类的访问?

java - 检查 hibernate 映射类中的不变量

java - 再次调用静态初始化器

Java同步外部文件读写

java 这个线程设置可以工作吗?或者我做错了什么