public class Solution {
public static void main(String[] args) throws InterruptedException {
Cat cat1 = new Cat("Мурка");
Cat cat2 = new Cat("Пушинка");
}
private static void investigateWorld() {
}
public static class Cat extends Thread {
protected Kitten kitten1;
protected Kitten kitten2;
public Cat(String name) {
super(name);
kitten1 = new Kitten("Котенок 1, мама - " + getName());
kitten2 = new Kitten("Котенок 2, мама - " + getName());
start();
}
public void run() {
System.out.println(getName() + " родила 2 котенка");
try {
initAllKittens();
} catch (InterruptedException e) {
}
System.out.println(getName() + ": Все котята в корзинке. " + getName() + " собрала их назад");
}
private void initAllKittens() throws InterruptedException {
kitten1.start();
kitten1.join();
kitten2.start();
kitten2.join();
}
}
public static class Kitten extends Thread {
public Kitten(String name) {
super(name);
}
public void run() {
System.out.println(getName() + ", вылез из корзинки");
investigateWorld();
}
}
}
Не могу понять почему в первоначальном варианте в методе void run() класса Cat точнее при его выполнении сначала на консоль выводится Мурка родила 2 котёнка и после этого сразу Мурка . Все котята в корзинке. А результат вызова метода initAllKittens(); только третьей строкой. Он же выполняется раньше чем вывод строки про корзинки. И почему если поставить вызов join как в коде то всё наоборот?Евгений
22 уровень
Почему такой порядок выполнения
Архивный
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
IceBergMaster
21 марта 2019, 12:33
Ну так а каково назначения метода join()? Ждать, если Мурка не будет ждать пока её котята полазят, то она просто сразу же начнет собирать их в корзинку. Т.е. сама Мурка(нить) не выполняет это задача котят(нитей).
0
Евгений
22 марта 2019, 03:17
Всё равно не понимаю - метод initAllKittens(); вызывается до System.out.println(getName() + ": Все котята в корзинке. " + getName() + " собрала их назад и значит по логике что сначала мы должны увидеть вывод в консоль System.out.println(getName() + ", вылез из корзинки"); а затем уже ...в корзинке и без вызова join().
0
IceBergMaster
22 марта 2019, 08:48
Видимо у тебя ещё не пришло понимание, как работают нити.
Котята и кошки выполняют код параллельно, так что здесь понятия "сначала" и "потом" относительны.
"метод initAllKittens(); вызывается до" - верно, но всё, что в нем происходит, это коротенький запуск двух нитей, дальше параллельная работа: кошки, без ожидания, могут сразу же начинать собирать котят в корзинку, а котята должны проснуться и исследовать мир, но не успевают это сделать, вот и получаем глючный вывод.
Запусти код пару раз, и увидишь что вывод будет меняться (без join)
0
Евгений
22 марта 2019, 11:03
А если добавляем метод join получается что кошка ждёт пока обе нити обоих котят выполнятся до конца и как результат появится вывод в консоль а уже затем нить кошки продолжит своё выполнение и "соберёт их в корзину"?
0
IceBergMaster
22 марта 2019, 11:57
Верно.
Означает, что мы, текущая нить (кошка), стоим и ждем пока kitten1 не выполнит свою работу.
0