Мониторинг состояния нити

  • 14
  • Недоступна
Cоздай класс нити LoggingStateThread, которая будет выводить в консоль все состояния (State) переданной в конструктор нити. Нить LoggingStateThread должна сама завершаться после остановки переданной в конструктор нити. Метод main не участвует в тестировании.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (114)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Flexo Bending Unit #3370318
26 мая, 15:43
хех, внимательно прочёл две предыдущие лекции, выпонил без сучка: в 32 лучших процентов, из 8429 выполнивших даже в требования особенно не вчитывался все бы задачи имели такой ясный фронт работ, эх
Иван
Уровень 37, Москва
23 мая, 11:41
Задача не плохая, на понимание нитей. разобрался. но Валя опять жжёт. Я в конструкторе, помимо инициализации нити, сделал ещё одно действие - Валя сказала, что так нельзя и нужна инициализация наблюдаемой нити, но у меня и так за ней есть наблюдение. И ещё момент. если на работе я напишу подобный код в многозадачном приложении, то мой шеф меня порвёт на британский флаг! Нельзя запускать процесс, который что-то делает без передышку в цикле. Ему НЕОБХОДИМЫ минимальные паузы, дабы остальные нити могли что-то хорошее сделать, иначе наш мониторинг будет душить всё остальное.
canny
Уровень 27, Россия
26 апреля, 19:24
Ну и зачем валидатор требует явного завершения нити, если мы её сделали демоном и она итак завершается даже с бесконечном циклом?
Даниил Александрович
Уровень 35, Тамбов , Россия
10 марта, 17:41
создалось впечатление, что состаяние меняется у Вали ровно когда вызывается
tr.getState()
поэтому прошел такой вариант, надо вызвать и сразу присвоить, а дальше пользуемся переменной.
if(!gg.equals(gg=tr.getState())) {
т.к. interupted() отказывается работать прерываемся по состоянию Терминатор :D
Eleonora
Уровень 35, Москва, Россия
5 марта, 14:28
Решил сравнением строк thread.getState().name(), забыл про существование переменных Enum))
Davilalexius
Уровень 33, Москва, Россия
25 ноября 2020, 10:05
Долго писал на сях) Тут недавно вернулся к обучению) И мозг завис... на предмет run(){soutprnt()} нарисовал себе, что ран бесконечно выполняется в общем цикле(как в avr). В общем while(true) в ране никто не отменял)
Dmitry Gorchakov
Уровень 30, Москва, Россия
12 сентября 2020, 16:59
Не знаю как у кого, у меня не всегда выводился TERMINATED Логичное решение - работать только через одну переменную, минимизировать вызовы getState(), например, при проверке условия и т.д. При повторном обращении может вернуться уже другое значение. У меня было в конце цикла:
if (target.getState()==State.TERMINATED) {
                isTerminated = true;
            }
Заменил target.getState() на переменную, хранящую инфо о состоянии, и всё стало ок)
Василий Бабин Мракоборец в Дурмстранг Expert
26 августа 2020, 11:58
5 ошибок пока правильно не выставил вывод. То вроде у себя всё работает, а по факту не верно. Если неправильно сделать вывод (я через if и elsa делал) если сделаешь неверно, то при нескольких выводах может выскочить 2 раза TERMINATED. Как сказал ниже barracuda надо раз пять потестить вывод и если выводится только как у него, то тогда можно и отправить на валидацию.
barracuda
Уровень 41, Санкт-Петербург, Россия
Expert
25 июля 2020, 21:31
Как правильно написал ранее Сергей, состояние нити может меняться очень быстро, и если писать лишний код и по много раз вызывать .getState(), можно что-нибудь упустить. Поэтому в методе run(): 1. Сохранить в переменную текущее состояние: Thread.State state1 = target.getState(); 2. Вывести егов консоль: System.out.println(state1); 3. В бесконечном цикле while(true): 3.1. Получить значение текущего состояния и записать в переменную еще раз: Thread.State state2 = target.getState(); 3.2. Если state1 != state2 ----> выводим state2 в консоль 3.3. присваиваем state1 = state2; (чтобы в следующий раз сравнивать с обновленной переменной, а не со старой. 3.4. если state2 == State.TERMINATED -----> return (условие выхода из бесконечного цикла) 4. Все. 5. Пока не будет такого вот устойчивого вывода в консоль несколько раз подряд, на валидацию лучше не отправлять: NEW RUNNABLE TERMINATED
Кирилл C.
Уровень 40, Санкт-Петербург, Россия
4 сентября 2020, 07:42
можно короче и проще: не нужно заводить 2 переменные state, достаточно одной. Мы же можем получить состояние напрямую от thread.getState(). да и цикл не обязан быть бесконечным. Условие работы цикла: thread.getState() != State.TERMINATED Хотя, признаюсь, Ваше решение мне очень помогло.
Алексей
Уровень 41, Чебоксары, Россия
28 сентября 2020, 10:19
Если условием работы цикла выставить thread.getState() != State.TERMINATED, то состояние Terminated не будет выведено в консоль. Это касается конкретно решения barracuda. Но можно эту операцию вывести после цикла.
Юрий
Уровень 30, Москва
22 ноября 2020, 18:21
Блестяще!
Dmitry
Уровень 30, Хабаровск, Россия
12 января, 05:33
Совершенно верно. А еще можно так (чтобы не выводить отдельно состояние Terminated после цикла):
do {
      ...
      ...
} while (target.getState() != State.TERMINATED);
Oleg
Уровень 28, Курган г, Россия
24 января, 13:50
Товарищ барракуда, скажи честно, у тебя опыт программирования есть? Я последние задачи только за счет твоих комментов решаю! Светлый ум...
barracuda
Уровень 41, Санкт-Петербург, Россия
Expert
24 января, 20:05
только мечтаю о том, чтобы он у меня был. Я сам читаю предыдущие комменты и резюмирую в основном, чтобы не потерялось для поколений )
Oleg
Уровень 28, Курган г, Россия
3 февраля, 16:08
Красавчик! Здоровья тебе!
Виталий
Уровень 27, Санкт-Петербург, Россия
16 марта, 19:11
Спасибо за комменты!
Евгений 45 уровень, Земля
23 марта, 10:47
Помогло, спасибо
Сафронов Алексей
Уровень 31, Йошкар-Ола, Россия
25 мая 2020, 13:32
Может кому поможет мое решение. В переопределяемом run() вызываем run() суперкласса. Создаем переменную (boolean) для выхода из цикла мониторинга, а также Arraylist строковых состояний нити. В цикле do-while в строковую переменную считываем текущий статус нити, далее проверяем есть ли значение данной переменной в Листе - если нет добавляем и печатаем его же в консоль. Далее сравниваем значение этой строковой переменной со значением "TERMINATED", и если оно такое булевая переменная меняет значение на маркер выхода из цикла do-while.
Иван Ганжа
Уровень 37, Москва, Россия
26 мая 2020, 20:50
1.Зачем вызывать run супер класса? 2. Зачем создавать лист, если можно работать сразу с енумом? 3. Зачем логическая переменная, если можно сделать бесконечный цикл с брейком по треминатед?