package com.javarush.task.task16.task1623;
/*
Рекурсивное создание нитей
*/
public class Solution {
static int count = 15;
static volatile int createdThreadCount;
public static void main(String[] args) throws InterruptedException {
System.out.println(new GenerateThread());
}
public static class GenerateThread extends Thread{
public GenerateThread() throws InterruptedException {
super(String.valueOf(++createdThreadCount));
start();
}
@Override
public void run() {
try {
Thread.sleep(1000);
if (Solution.count > createdThreadCount) {
System.out.println(new GenerateThread());
}
}catch (InterruptedException e){e.getStackTrace();}
}
@Override
public String toString() {
return (getName()+" created "+currentThread().getName());
}
}
}
в общем задачу решил, но почитал комментарии и увидел, что люди пишут о разнице между if и while, но я так и не понял разницы, потому что при смене if на while размножение "почкованием" не происходит. Возможно я что-то делаю не так, но я просто хочу на примере увидеть разницу, а на данном примере разницы не вижу. "Ткните" пальцем в код, что я делаю не так, чтобы увидеть и понять наконец-то эту разницу между этими двумя операторами...Рустем
22 уровень
Помогите разобраться...
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Sergey MorozExpert
31 января 2019, 05:20решение
Как я понимаю, разница в том, что как только создана первая нить и входит в блок while, она забирает "стволовые" функции на себя и нити исходят как бы из одной точки (пока while не отработает до конца полный цикл, этот капкан не разожмется).
В случае же с if первая нить создалась, зашла в проверку, создала "дочернюю" нить и всё, блок if отработал - управление передается дальше по каскаду, как бы следующей доминошке.
Вобщем, образно
while - это создание нитей из одного единственного ствола, как пальцы и ладонь
if - создание нитей каскадом - одна из другой, как телескопическая антенна или падающие домино.
+2
Рустем
31 января 2019, 05:49
то есть в данном примере , если поставить while, то вывод будет производиться из одного потока(поэтому, если к выводу добавить currentThread.getName(), то отобразится только первый поток-дочерний поток?), а если if, то поток будет исходить друг за другом из своего родителя, верно?
0
Рустем
31 января 2019, 05:53
и еще один момент я не понял, возможно кто-то сможет мне растолковать его. Почему при создании объекта в самом объекте неявно вызывается переопределенный момент toString ? Сейчас пытаюсь на отдельном примере создать объект в main, но вызова неявно toString не происходит, но если создавать конкретно в объекте(я так понял это и есть рекурсия), то он вызывается неявно и производит вывод строки, которую я в методе toString вернул...
0
Sergey MorozExpert
31 января 2019, 06:02полезный
С toString всё намного проще, а то прям целую магию придумал :)
println, вызванный на объекте, обращается либо к родительскому toString, либо к переопределенному toString, как в нашем случае +2
Рустем
31 января 2019, 06:10
с toString разобрался спасибо большое! А что насчет if и while всё таки ? Я правильно расписал алгоритм операторов if и while в конкретном примере?
0