Рекурсивное создание нитей

  • 9
  • Недоступна
1. Измени класс GenerateThread так, чтобы он стал нитью. 2. Создай конструктор GenerateThread, который должен: 2.1. Вызвать конструктор суперкласса с параметром String - номером созданной нити. Используй createdThreadCount. 2.2. Запустить текущую нить. 2.3. Номер первой нити должен начинается с 1.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (156)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Maksim29 уровень, Санкт-Петербург
10 января, 09:34
7 попыток. Надо было писать:
return getName() + " created";
и
super("" + ++createdThreadCount);
Причем у меня вывод был: 2 created 14 created 12 created 8 created 13 created 15 created 9 created 10 created 5 created 7 created 4 created 6 created 11 created 3 created 1 created
Владимир Настоящий31 уровень, Санкт-Петербург
21 декабря 2018, 20:24
super("" + ++createdThreadCount);
Igor17 уровень, Санкт-Петербург
10 января, 09:20
setName(String.valueOf(createdThreadCount)); так плохо ?
CEO20 уровень
четверг, 09:34
по идее так лучше
Роман16 уровень
четверг, 09:56
super(Integer.toString(++createdThreadCount));
Igor_kj18 уровень, Киев
17 декабря 2018, 18:39
с 3-й попытки, не мог понять почему дважды выводится первая нить, а все просто в run-не нужно вывод и создание нити объединить)))
Олександр20 уровень, Харьков
3 ноября 2018, 17:40
Не понял почему когда был while валидатор не принимал, а когда заменил while на if - принял. Может кто подсказать? Хотя вывод сохранился одинаковый.
Сергей18 уровень, Москва
4 ноября 2018, 11:25
По условию должно быть так - main запускает первую нить, первая нить запускает вторую, вторая третью и т.д. получается рекурсия. Когда используешь while, получается первая нить запускает вторую, потом - третью и т.д.
Олександр20 уровень, Харьков
4 ноября 2018, 14:55
Благодарю
Анатолий23 уровень, Москва
9 ноября 2018, 05:12
В условии явно сказано: "Пока количество созданных нитей меньше Solution.count метод run должен". Это строго говорит о цикле, а не об условии. Т.к. while тоже работает корректно, а валидатор не принимает, считаю, что в задачи искажение в условии.
Даша19 уровень, Харьков
29 ноября 2018, 16:17
возможно, заголовок задачи о рекурсии, который я увидела почти случайно, слегка перевешивает в сторону как бы корректного формулирования задания)))
Игорь22 уровень, Нижний Новгород
26 декабря 2018, 18:45
Когда используешь while, получается первая нить запускает вторую, потом - третью и т.д.
Мне кажется,что это не совсем так. Есть while в первой нити -> проходим проверку условия -> заходим в тело цикла -> создаем новый объект GenerateThread, т.е. вторую нить -> тем самым вызывая его конструктор (а не переходя на второй виток цикла while в первой нити) -> а значит при вызове конструктора второй нити мы ее и запускаем -> опять проверка условия цикла (только уже во второй нити) -> опять создание новой (третьей) нити, но уже из второй -> и т.д. Когда createdThreadCount дойдет до 15, очередной (пятнадцатый вложенный) while не пройдет проверку условия и у 15-й нити закончится выполнятся run(), при этом программа перейдет на проверку условия while в 14-й нити, но счетчик-то общий - т.е. условие опять не выполнится и т.д. Т.е. получается самая что ни на есть рекурсия. А вот почему валидатор не пропускает- вопрос.
Игорь22 уровень, Нижний Новгород
26 декабря 2018, 19:08
На самом деле, еще раз все обдумав, получается ситуация — что-то среднее между вариантом «первая нить порождает все остальные» и «каждая предыдущая нить порождает одну последующую». Все то, что я написал в предыдущем посте, сработало бы если бы это был один поток. А в случае использования нескольких thread'ов получается первая нить, породив вторую, продолжает с ней работать параллельно. Т.о. в последствии каждая из них может породить еще нити (сколько конкретно каждая — не известно). Эту ситуацию хорошо иллюстрирует картинка из поста ниже, чтобы не искать вот ссылка. Только ни кто не гарантирует, что с while каждая вершина будет родителем двух других. Может двух, может одной, а может трех-четырех — это как java решит. В общем, если копнуть поглубже, не такая уж и простая задачка получается. Но как хорошо на ней учиться — прям проясняется тема про эти thread'ы.
Igor17 уровень, Санкт-Петербург
10 января, 09:19
WHILE или IF вот в чем вопрос
Nikita Krutov41 уровень, Москва
2 ноября 2018, 09:17
Странно, если делать проверку колчества нитей не в методе run, то Валик отказывается принимать, причём сам соглашается, что вывод соответствует условию задачи...
Иван23 уровень
1 ноября 2018, 08:21
Помогла подсказка Володимир Штаба не надо делать Вайл
Dmitriy 18 уровень, Москва
17 октября 2018, 21:59
Блин, это реально жесть какая то, всю голову сломал. Всё написал правильно с первого раза, но ловил ошибку по не соблюдению пункта 3.1. А косяк оказался в том, что надо использовать не Thread.currentThread().getName() + " created", а просто getName() + " created". Может кто то объяснить какая же всё-таки в контексте задачи между ними разница?
Katerina31 уровень, Москва
23 декабря 2018, 21:36
Насколько я понимаю, Thread.currentThread().getName() возвращает имя потока, в котором он вызван. В таком случае при первом создании нашего потока и вызове toString в методе main, он вернет "main created", а не имя нового потока.
Павел Ку19 уровень
24 сентября 2018, 12:46
16 попыток
tony_stark24 уровень
19 сентября 2018, 19:20
жесть. даже после того как прочел коменты решил задачу только через два часа. В run() вместо того что бы написать
System.out.println(new GenerateThread());
писал:
new GenerateThread();
toString();
просто facepalm.
RuslanN26 уровень, Нижний Новгород
25 ноября 2018, 21:38
Спасибо!!!! 12 Попыток!!!
Дмитрий18 уровень, Санкт-Петербург
30 августа 2018, 14:40
Задание называется "Рекурсивное создание нитей", обратите внимание. Это значит, что метод main должен породить нить_1, нить_1 должна породить нить_2 и так далее. Не наступайте на грабли, когда метод main породит нить_1, а нить_1 породит все остальные нити.
Алексей22 уровень, Москва
10 октября 2018, 20:01
Поддерживаю, 4 попытки на это потратил, итог 5)