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中,为什么在输入值之前输出完成的行?
答案 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秒内,它会超过睡眠状态。