Задать вопрос
DaleMartinWatson
@DaleMartinWatson
Студент-программист

Почему потоки в Java ведут себя так неочевидно?

По логике при запуске потока должен вывести то, что что внутри потока.
package com.company;
public class Main
{

    static Egg mEgg;

    public static void main(String[] args) {
    mEgg = new Egg();

    mEgg.start();

    System.out.println("END");
   }
}

class Egg extends Thread
{
    @Override
    public void run() 
    {
        System.out.println("EGG !");
    }
}

Но выводит так.
END
EGG !
  • Вопрос задан
  • 524 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
EugeneP2
@EugeneP2
Java Dev
Для создание потока нужно определенное время и для его работы должно быть выделено процессорное время.

Метод Thread.start() не ждет создание потока, а сразу же отпускает поток вызвавший его.

Основной поток Main уже создан и выполняется, потому он срабатывает быстрее.

Egg - не демон-поток, потому джава будет ждать его завершения, т.е. вывода на экран "EGG !"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@onepavel
Консультация и разработка мобильных приложений
Все очевидно и результат правильный.
В чем проблема-то ?
Ответ написан
Комментировать
kivsiak
@kivsiak
software engineer
А почему вы думаете что но должно быть именно так? А если два Egg запустить, какой сработает раньше?
Зачем по вашему нужен Thread.join()?
Ответ написан
Комментировать
@bromzh
Drugs-driven development
По логике при запуске потока должен вывести то, что что внутри потока.

По логике, не должен. Просто ты пока не понял логики многопоточности.
Синхронизаций-то никаких нет, значит нет гарантий, что побочный тред напечатает раньше, чем главный. Хочешь дождаться завершения треда - используй семафоры, например. Нужен результат - используй Future.
Ответ написан
Комментировать
voidnugget
@voidnugget
Программист-прагматик
bromzh прав, от себя добавлю что есть ещё состояние гонки и оба потока могут обращаться к одному и тому же файловому дескриптору, в данном случае STDOUT, - нет гарантии что оба потока не будут писать EGG и END одновременно и не получится абракадабра типа EEGNG !D ;)

Подобное поведение характерно для любой многопоточности, и Java тут не причём.
Для избавления от головной боли используют модели актёров и Share nothing подходы типа всяких Akka, Greenlet'ов или процессов в Erlang'е, но на определённом этапе и с ними начинаются проблемы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы