основной поток не должен запускаться, когда другие потоки усыпляются - PullRequest
2 голосов
/ 10 мая 2011

По моему мнению, вывод этой программы может быть только

Hello 0 1 2 3 4 Yes

Но ответ также включает в себя

0 1 2 3 4 Hello Yes

в качестве возможного ответа.Мой вопрос: когда тест помещается в спящий режим, разве main не должен быть единственным другим потоком, переходящим в рабочее состояние, таким образом, привет всегда должен быть напечатан первым?

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 ]

3 голосов
/ 10 мая 2011

Порядок выполнения потоков недетерминирован ... возможно, режим сна разрешит запуск другого процесса, а ваш тестовый поток возобновится, когда выполнение вернется к вашему процессу ... режим сна не является хорошим методом синхронизации

Если вы хотите начать контролировать порядок, в котором все делается, тогда вам нужно взглянуть на такие вещи, как Mutex ...

1 голос
/ 10 мая 2011

Большую часть времени он будет делать то, что вы ожидаете. Но есть действительно очень маленький шанс, что даже если поток спит в течение 2 секунд, main не сможет запустить.

Суть в том, что Thread.sleep не заставит планировщик запустить другой поток (хотя это даст довольно хороший совет).

...