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

  • 18
  • Недоступна
1. Измени класс GenerateThread так, чтобы он стал нитью. 2. Создай конструктор GenerateThread, который должен: 2.1. Вызвать конструктор суперкласса с параметром String - номером созданной нити. Используй createdThreadCount. 2.2. Запустить текущую нить. 2.3. Номер первой нити должен начинается с 1.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (574)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Роман мастер-энергетик
30 августа, 10:55
не нужно забывать про посткремент называется
Denis Malyshev QA в Sber
23 августа, 21:50
мдаа.....все верно сделал, но долго не мог понять что не так....вместо if в run поставил while....
Стас
Уровень 30, Уфа
24 августа, 02:57
ага, самое интересное в условии написано: а в валидаторе - если.
Julia
Уровень 27, Sochi, Россия
15 сентября, 15:38
Точно так же попалась)
Монкє
Уровень 30, Киев, Украина
12 августа, 13:02
это решение конечно крутое и правильное но не очень , при подобном подходе из-за нескольких секунд задержки при создании одной нити , создастся следующая и в итоге у нас будет не 1 , 2 , 3 и т.д. , а может получится 4 , 5 , 3 , 1 , 15 и прочие комбинации. не порядок дорогие авторы)
Сергей
Уровень 26, Москва, Россия
15 июля, 20:30
По факту задача легкая, но надо мозг сломать, чтобы сделать правильно
Ivasishinav
Уровень 30, Минск, Беларусь
1 июля, 20:10
Подскажите, пожалуйста, почему при переопределении метода toString при коде:
return getName() + " created";
выдает "1 created", а при
return Thread.currentThread().getName() + " created";
выдает "main created"? они же по сути должны возвращать имя потока, который его вызвал, а функция вызова не менялась, т.е. их вызывал в обоих случаях один и тот же поток:
System.out.println(new GenerateThread());
Богдан
Уровень 18, Россия
3 августа, 08:54
Потому что метод .toString() вызывается из Solution.main();
Андрей
Уровень 19
14 июня, 09:26
А вывод не всегда почему то выводит 15 строк "1 created". Хотя проверку прошло
Сонмониус Java Developer в Face IT
4 июня, 11:56
я попыток пять спалил на то, что выводил в методе run не новый поток, а текущий
Ilya Kuzmin
Уровень 28, Шанхай, Китай
1 июня, 11:34
Решил задачу, все выполняется, считается, работает, выводит все 15 строк по порядку с переопределенным ТуСтринг, но валидатор не пропускает. Благо нет времени на угад е*****я с компилятором, просмотрел готовый ответ и офигел. Значиться у меня так:
public GenerateThread() {
            super(String.valueOf(createdThreadCount++));
        }
и валидатор пишет ошибку: Конструктор класса GenerateThread должен увеличивать значение createdThreadCount и передавать его в виде строки в конструктор суперкласса. окей..... вроде мой код это и делает же не ? Тогда как правильно ?
public GenerateThread() {
            super(String.valueOf(++createdThreadCount));
                 }
Да пшел ты!"!!111 🤕
Сонмониус Java Developer в Face IT
4 июня, 11:51
Выполните этот код
int a = 5;
        System.out.println(a++);
        a = 5;
        System.out.println(++a);
Сонмониус Java Developer в Face IT
4 июня, 11:55
Т.е. условие "Вызвать конструктор суперкласса с параметром String - номером созданной нити" в вашем варианте не выполняется, вы вызываете конструктор с номером текущей нити. Можно конечно обижаться на валидатор, я сам иногда так делаю, но все же когда начинаю разбираться что не так, в 99% случаев у него есть какие-то объективные причины не принимать ответ. И обычно выплывают какие-то нюансы, которые лучше узнать сейчас, на задачах объемом в 20-30 строк, чем когда программа весит 500мб+, и в ней неправильно обрабатывается число, которое проходит через 200 методов. Но это имхо конечно.
Ilya Kuzmin
Уровень 28, Шанхай, Китай
5 июня, 04:51
Согласен, получается, что если например, нитей нет, то счетчик у нас 0, и если мы создаем нить и присваиваем ей номер то надо в конструктор вставлять ++счетчик так как в противном случае ( счетчик++ ) вставиться 0 и ТОЛЬКО потом будет инкремент который пойдет в конструктор след нити. будет как бы созданы 2 нити но с номерами 0 и 1. наверно это правильно для программы где отсчет с нуля , но для человека отсчет то с 1 идет. Спс за эксплонейшен, на свежую голову легче видны нюансы чем после 3-4 часов раша.
Сонмониус Java Developer в Face IT
5 июня, 17:44
есть такое) Тоже часто после отдыха задачи которые решал часами, решаются минут за 5-10 минут.
Y.Druziakin
Уровень 27, Ukraine
17 сентября, 16:27
точно также попался на инкременте, благодаря этому комментарию не пришлось смотреть "готовое решение" 😁 Благодарю
Никита
Уровень 25, Gdańsk, Poland
4 мая, 18:24
@Override
       public String toString() {
           return super.getName() + " created";
       }
Не могу понять почему нужно возвращать getName суперкласса, а не currentThread().getName().....
milyasow
Уровень 34, Москва, Russian Federation
19 мая, 14:15
Там нет вызова суперкласса, только getName(), то есть ему неявно передается this.
Edward Northwind
Уровень 20, Мариуполь, Украина
3 мая, 15:37
Вы, блин, серьезно? Вы предлагаете делать не атомарную операцию в над переменной, от которой зависит количество и названия потоков?! Вы антипримерами решили заняться?
LastOFUS
Уровень 30, Баку, Azerbaijan
15 мая, 10:21
что это значит?
Edward Northwind
Уровень 20, Мариуполь, Украина
17 мая, 10:04
То, что ++createdThreadCount это не одна операция, а 3. 1. Считай значение createdThreadCount 2. Увеличь значение createdThreadCount 3. Запиши значение createdThreadCount Потоки работают конкурентно, даже если ты поставишь volatile - это всего лишь значит, что все потоки будут иметь доступ к одному общему "объекту". Но это не значит, что каждый поток будет строго поочереди выполнять все 3 операции. Чаще всего будет так, что несколько потоков считали, пусть будет 1, каждый независимо увеличил значение до 2. И потом каждый записал 2 в createdThreadCount, что не верное поведение. volatile можно использовать тогда, когда значение читает много потоков, а меняет только один. Во всех иных случаях нужно использовать или synhronize или Atomic переменные.
milyasow
Уровень 34, Москва, Russian Federation
19 мая, 14:52
Вроде как у int и так Atomic доступ, и volatile нужен только для тех, что не помещаются в 32 бита. Ну и в случае, если бы несколько потоков считали, пусть будет 1, каждый независимо увеличил значение до 2. И потом каждый записал 2 в createdThreadCount, то у нас должно было получиться несколько потоков с именем "2", или "5", или "13", но этого не происходит. Рекурсия это же последовательный процесс.
Anonymous #2436575 Android Developer в AllPets
23 июля, 07:31
Атомик и синхронизатор очень разные вещи. Операции над всеми примитивами кроме long/double по умолчанию атомарны. А что касается инкремента, в конструкторе находится один поток за раз, создание следующего не начнется до запуска start() который идет дальше по коду. Так что доступ тут, фактически, синхронизирован.