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()
什么都不做,只等Threadt
完成。”后者特别有用,因为许多新手从t.join()的某个地方得到了错误的想法
对线程执行一些操作t
.Re,“…暂停线程”(或“阻止线程”或“睡眠(原文如此)线程”等)。对于尚未完全掌握概念的新手来说,其中一些词是绊脚石。有时,如果你说,“Thread.sleep(2000)
什么都不做,只等两秒钟。”或者“t.join()
什么都不做,只等Threadt
完成。”后者特别有用,因为许多新手从t.join()的某个地方得到了错误的想法
对线程t
执行某些操作。