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

时间:2018-04-24 21:52:32

标签: 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中,为什么在输入值之前输出完成的行?

2 个答案:

答案 0 :(得分: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秒,另一个线程继续运行。

答案 1 :(得分:0)

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