Java - Thread join () и порядок выполнения SCJP вопрос? - PullRequest
1 голос
/ 29 июля 2011

Я немного потренировался на экзамене O / SCJP. Рассмотрим следующий код:

public class Cruiser implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread a = new Thread(new Cruiser());
        a.start();

        System.out.print("Begin");
        a.join();
        System.out.print("End");
    }

    public void run() {
        System.out.print("Run");
    }
}

Источник: http://scjptest.com/mock-test.xhtml

Сайт сообщает, что вывод (ответ на их ложный вопрос) будет BeginRunEnd, и при нормальном запуске класса это именно то, что выводится.

Однако при отладке выводом является RunBeginEnd.

Справедливо ли сказать, что при нормальном исполнении вывод будет всегда будет BeginRunEnd или будет варьироваться в зависимости от других факторов (например, как тяжелый новый класс потока / сколько времени после запуска потока требуется, чтобы присоединиться к нему)?

Вы бы сказали, что это честный / точный экзаменационный вопрос?

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

Я думаю, что BeginRunEnd более вероятно , чем RunBeginEnd (я ожидаю, что процесс фактического запуска нового потока займет некоторое время, прежде чем он достигнет метода run, и для первого потока чтобы добраться до распечатки, прежде чем он исчерпает свой временной интервал в большинстве случаев), но было бы неправильно выверено , чтобы предположить, что при программировании.

Вы должны считать эти два потока полностью независимыми, как только вызывается start, пока они не будут явно снова связаны друг с другом с помощью вызова join. Логично, что новый поток может завершиться до завершения, прежде чем основной поток напечатает «Начало».

Выглядит как плохой вопрос для меня.

2 голосов
/ 29 июля 2011

Это мусорный вопрос. Результат не определен без синхронизации.

Это действительно вопрос SCJP, или он задуман каким-то сайтом, пытающимся продать обучение SCJP? Если это последнее, то я бы избежал этого места, как чума.

1 голос
/ 29 июля 2011

Вероятно, это зависит от платформы, но показать, что порядок может измениться.

public class Cruiser implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread a = new Thread(new Cruiser());
        a.setPriority(Thread.MAX_PRIORITY);
        a.start();

        // Thread.sleep(1);

        System.out.print("Begin");
        a.join();
        System.out.print("End");
    }

    public void run() {
        System.out.print("Run");
    }
}

печатает при первом запуске.

RunBeginEnd

однако после этого в основномthe BeginRunEnd

Если поток останавливается, даже в течение 1 мс он будет генерировать RunBeginEnd почти каждый раз.

...