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/