当其他线程进入休眠状态时,主线程不应该开始执行

时间:2011-05-10 07:07:47

标签: java thread-sleep

在我看来,这个程序的输出只能是

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 + " ");
            }
    }
}

2 个答案:

答案 0 :(得分:3)

线程运行顺序是非确定性的...可能是睡眠将允许另一个进程运行,并且您的测试线程是在执行返回到您的进程时恢复的那个...睡眠不是一个好的同步方法

如果您确实想要开始控制完成任务的顺序,那么您需要查看Mutex之类的内容......

答案 1 :(得分:1)

大部分时间它会按照您的期望行事。但是有一个非常小的机会,即使线程休眠2秒,主也没有机会运行。

重点是:Thread.sleep不会强制调度程序运行另一个线程(虽然它会给它一个非常好的提示)。