Задачу приняли, но почему то она на экран вывод каждый раз разное количество нитей, может кто нибудь объяснить почему так происходит?
Диана
20 уровень
Выводит разное количество нитей каждый раз
Решен
Комментарии (8)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
GrandPaJunior
30 апреля 2020, 12:55
Объясните плз о переопределении метода toString()
Мы же его не вызываем в коде нигде, как он работает?
0
Александр
16 июня 2020, 15:06
Вообще хорошо бы поискать в инете про toString(), там лучше написано. Попробую кратко объяснить, но могу ошибаться:
Он вызывается неявно когда мы распечатываем объект(ссылку на объект) в консоль к примеру System.out.println(new GenerateThread()), то получим что-то типа Thread[1,5,main].
toString() метод класса Object и есть у каждого объекта, т.к. все объекты наследники класса Object и он позволяет представить объект(ссылку на объект) в строковом виде (package.class@hashCode).
Мы переопределяем toString() у класса Object.
https://javarush.com/help/364
+1
Павел Безумный учёный Expert
11 апреля 2020, 23:05полезный
Предположу, что Вы столкнулись с ситуацией, когда сообщения о создании нитей выводятся в консоль в произвольном порядке, например, таким образом:
Такое поведение может быть обусловлено тем, как именно реализован метод run( ).
При таком варианте реализации run( ) нити будут создаваться последовательно: сначала в main( ) создаётся нить 1, которая выполняет код своего метода run( ), в результате чего создаётся нить 2, которая в свою очередь выполняет метод run( ), порождая при этом нить 3, и так далее. В этом и состоит рекурсия – каждая следующая нить является результатом работы предыдущей нити. При этом каждая нить создаёт только одну новую нить (код блока if выполняется только 1 раз) и, удовлетворившись этим, завершает свою работу (можно сказать, передаёт эстафету). Получается цепочка последовательных созданий нитей, и в консоль будут выведены сообщения в порядке возрастания номеров нитей.
+3
Павел Безумный учёный Expert
11 апреля 2020, 23:10полезный
Другую картину можно наблюдать в консоли, если в теле метода run( ) заменить оператор if на цикл while:
В этом случае каждая нить теоретически (и практически) может создать более одной дочерней нити, пока не будет выполнено условие остановки цикла. Например, может возникнуть ситуация, когда первая нить создаст, скажем, три дочерних нити, а те, в свою очередь, создадут ещё несколько (пока будет позволять счётчик createdThreadCount). Все эти нити (или же некоторые из них) будут работать параллельно, в результате чего между ними возникнет конкуренция за доступ к процессору и консоли. В каком порядке эта конкуренция будет разрешена – решает планировщик потоков, поэтому сообщения в консоли могут быть перемешаны по-разному при каждом новом выполнении программы.
Кроме того, в процессе параллельного выполнения несколько нитей могут перезаписывать счётчик createdThreadCount как в сторону увеличения его значения, так и «откатывать» его назад. В результате общее количество созданных нитей может превысить заданное изначально значение 15. Такое поведение становится особенно заметным, если в код метода run( ) перед созданием новой нити добавить небольшую паузу:
+3
Стас ПасинковSoftware Developer в ZipyMaster
12 апреля 2020, 01:08
мне кажется, вы заслужили орден почетного телепата джавараша)
потому что я, например, без кода, который выдает разное количество нитей вообще ничего сказать не смог бы))
0
Диана
13 апреля 2020, 10:26
Метод run реализован таким образом.
А вывод на экран может выглядеть таким образом:
1 created
2 created
или
1 created
2 created
3 created
4 created
5 created
Либо же выводятся все 15 нитей.
При этом валидатор принял задачу, поэтому не могу опубликовать свой код полностью в вопросе.
0
Павел Безумный учёный Expert
13 апреля 2020, 12:21решение
Это баг браузерной IDE. После нескольких запусков программы в браузере я получил результат, аналогичный Вашему: в большинстве случаев выводились только два первых сообщения, и изредка - все 15 сообщений. В то же время код исправно работает при его выполнении в IntelliJ IDEA (соответственно, валидатор принял Ваш код, поскольку он работает корректно).
+2
Диана
14 апреля 2020, 08:10
А, спасибо, а то думала что упустила уже что то)
0