Не валять дурака

  • 14
  • Недоступна
Восстанови логику класса TaskManipulator.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (177)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
TemaCode
Уровень 46
9 ноября 2022, 17:01
new Thread(this,"name")
Михаил
Уровень 30
8 ноября 2022, 09:49
Добавлю к предыдущим комментариям - вывод Thread.currentThread.getName() должен быть до sleep() - только так у меня вывод получился как в джавадоке, и только после этого валидатор принял.
И. Ж.
Уровень 28
16 сентября 2022, 20:07
Хочу обратить внимание на одну вещь, ее нигде не пишут, но уже с которого раза спотыкался и понял наконец! К примеру при решении данной задачи, так что валидатор принимает, если запустить программу, то выходит 5 эксепшенов что выбрасываются и таким образом потоки прерываются. Это происходит из за того что мы метод stop вызываем в момент когда поток спит, и там во время сна судя по всему в каждый момент времени происходит проверка на isInterrupt() или через каждые какие то доли секунды. То есть наши потоки прерываются не из за того что цикл while глушит, а именно в методах sleep. Чтоб через цикл прервалось, это надо чтобы очень повезло чтоб мы метод стоп вызвали именно в то мгновение когда поток не спит, а основное время как раз проходит в методе sleep. И потом когда попадаем в catch там по умолчанию бросаем RuntimeException и таким образом из потока выходим. Но а если не хотим чтобы так, а просто в catch хотим например просто сообщение увидеть без нового exception. То тогда как оказалось поток все равно не прервется, и цикл будет дальше до бесконечности выполняться. То есть главный момент: если мы прерываемся в методе sleep и попадаем в catch с пойманным interrupt исключением, то флаг isInterrupt() возвращается в false!!! И таким образом если хотим прервать поток после того как поймали исключения из sleep, то надо в catch еще раз вызвать interrupt() чтоб выставить true, и только тогда цикл прервется. catch (InterruptedException e) { System.out.println(e.getMessage()); Thread.currentThread().interrupt(); }
Василий Чи
Уровень 50
27 декабря 2022, 19:00
Спасибо!
WillMage
Уровень 36
25 августа 2022, 14:38
опять блин с условием морока, я думал что манипулятор это отдельный поток который что то производит с отдельным пучком потоков, но задача не об этом, задача про то как манипулятор манипулирует собой.
JewArnold
Уровень 51
28 июля 2022, 09:47
Уровень растет, понимания не прибавляется. Для чего эта строчка, если у нас есть инициализированный поток в самом классе? Thread thread = Thread.currentThread(); Не понимаю
Сергей Смирнов
Уровень 36
25 августа 2022, 09:45
А да, это не так просто для понимания, но я попытаюсь объяснить. В методе:
public void start(String threadName)
мы создаем новый трэд в который передаем объект this.
thread = new Thread(this, threadName);
this в этом случае это объект класса TaskManipulator. И в тот момент когда выполняется вот этот код:
new Thread(this, threadName)
в поле
private Thread thread;
объекта this отсутствует какое либо значение, т.е. оно равно null. Другими словами в новом потоке у нас будет объект TaskManipulator с пустым приватным полем thread. После чего мы присваиваем ссылку на этот(только что созданный) тред полю private Thread thread; в объекте manipulator , который был создан в методе майн.
thread = new Thread(this, threadName);
В результате, когда мы запускаем метод thread.start(), запускается метод run() на объекте thread у которого внутри лежит this с еще непроиницилизировнным полем private Thread thread; поэтому чтобы обращаться к полям текущего трэда мы получаем на него ссылку самостоятельно перед запуском цикла. P.s. это объяснение подойдет к правильному решению от javarash, но я думаю что вы имели ввиду именно его.
Ivan T
Уровень 29
1 июня 2022, 21:07
Секрет тут: catch (InterruptedException e) { break; }
defezis Кредитоплатильщик в Дом 🏠
15 апреля 2022, 09:30
Сначала подумал TaskManipulator - отдельная нить. А создавать нужно пустые Thread. Подсказка на верный путь - в start() нужно создать Thread, передать TaskManipulator и имя. 😅 отдохну-ка полчаса.
The Body of the Atr
Уровень 51
5 апреля 2022, 06:33
без комментов не решить) Ключевые моменты: - в run() в цикле в try, если статус RUNNABLE выводишь в консоль имя, потом спишь 100, в catch - break; - в start имя нити присваивается через конструктор нити с двумя параметрами первый - таскманипулятор, второй имя нити. Так как start не настоящий, не забыть стартануть в старте; - в stop останавливаем то, что создали в старте, а не Thread.currentThread() Всего эту задачу решили 9300 учеников.
Александра
Уровень 33
28 марта 2022, 10:03
9 попыток💃
16 февраля 2022, 11:22
...
third
fifth
fifth
тоже принял 👌