在我看来,这个程序的输出只能是
Hello 0 1 2 3 4 Yes
但答案列表
0 1 2 3 4 Hello Yes
也是一个可能的答案。我的问题是,当测试进入睡眠状态时,主要是唯一的其他线程移动到运行状态,这样你应该首先打印Hello吗?
public class Lean
{
public static void main(String args[]) throws Exception
{
Test test = new Test();
test.start();
System.out.print("Hello ");
test.join();
System.out.print("Yes");
}
}
class Test extends Thread
{
public void run()
{
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{}
for (int counter=0; counter<5 ; counter++)
{
System.out.print(counter + " ");
}
}
}
答案 0 :(得分:3)
线程运行顺序是非确定性的...可能是睡眠将允许另一个进程运行,并且您的测试线程是在执行返回到您的进程时恢复的那个...睡眠不是一个好的同步方法
如果您确实想要开始控制完成任务的顺序,那么您需要查看Mutex之类的内容......
答案 1 :(得分:1)
大部分时间它会按照您的期望行事。但是有一个非常小的机会,即使线程休眠2秒,主也没有机会运行。
重点是:Thread.sleep
不会强制调度程序运行另一个线程(虽然它会给它一个非常好的提示)。