我在这里看到了类似的问题,但我认为我的不是重复的。 我无法理解这个例子:
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread() {
public void run() {
System.out.println("t1");
}
};
Thread t2 = new Thread() {
public void run() {
System.out.println("t2");
}
};
t1.start();
Thread.sleep(1000);
t2.start();
Thread.sleep(1000);
System.out.println("main");
}
为什么它始终以相同的顺序打印线程名称?
t1
//1 sec pause
t2
//1 sec pause
main
为什么在Thread.sleep(1000)
迫使t1.start()
线程等待后t2
?为什么t2
不能立即开始执行run方法?
答案 0 :(得分:3)
将您的程序视为一个字符串(Thread),当您运行程序(Thread.start)时,您开始在该字符串(您的代码)上放置珠子。这意味着一个人必须继续前进,如果你睡觉(Thread.sleep)它就像你指定的时间放下那条线程一样,所以你不再在它上面放置珠子(简单的类比,对于那些#39;了解)。
你所做的是获得你的第一个线程(主)然后启动2个新线程(t1,t2)但是它们还没有起作用,当你调用Thread.start()时它们变得有用了。您当前的功能线程(主)具有睡眠命令,该命令将暂停该线程中的所有活动1秒钟。 所以你的程序是这样排序的:创建线程1和2(t1,t2),启动线程1(t1)然后暂停1秒,然后启动线程2(t2),然后暂停一秒钟,然后打印字符串& #34;主&#34 ;;
答案 1 :(得分:2)
因为此代码中的sleep方法具有运行main()
的线程,所以在启动另一个线程和启动下一个线程之间暂停一秒。
答案 2 :(得分:2)
当你的程序启动时,它从“主”线程开始,
调用“Thread.start()”分叉执行(导致t1并行开始),然后告诉“Main”线程休眠1秒,然后启动第二个线程,最后打印“主要”
答案 3 :(得分:0)
似乎您迫使t2
等待,因为在t2
启动时尚未启动t1
。
考虑你和两位助手,Alice和Bob。你告诉他们两个人,当你说出他们的名字时,他们应该回答说出他们的名字。您当前的执行是:
当你说爱丽丝时,爱丽丝会回复她的名字。好像鲍勃正在等待,在某种程度上他是 - 他等着你说出他的名字(开始他的线索)。当然,爱丽丝总是(或几乎总是)在鲍勃之前说出她的名字。爱丽丝听取她的名字并以实物回复并不需要一整秒的时间。将此与以下执行相对照:
在这个范例中,您实际上并不知道将首先说出哪个名称。你先说alice,但两者之间没有空间,所以它取决于Alice和Bob哪一个有更快的反应。这将对应于:
t1.start();
t2.start();
Thread.sleep(2000);
System.out.println("main");
答案 4 :(得分:0)
以下代码修改后可以达到您的预期目标:
thread1.start();
thread2.start();
Thread.sleep(2000);