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

  • 14
  • Недоступна
Cоздай класс нити LoggingStateThread, которая будет выводить в консоль все состояния (State) переданной в конструктор нити. Нить LoggingStateThread должна сама завершаться после остановки переданной в конструктор нити. Метод main не участвует в тестировании.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (100)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Davilalexius 27 уровень, Москва
25 ноября, 10:05
Долго писал на сях) Тут недавно вернулся к обучению) И мозг завис... на предмет run(){soutprnt()} нарисовал себе, что ран бесконечно выполняется в общем цикле(как в avr). В общем while(true) в ране никто не отменял)
Dmitry Gorchakov 27 уровень, Москва
12 сентября, 16:59
Не знаю как у кого, у меня не всегда выводился TERMINATED Логичное решение - работать только через одну переменную, минимизировать вызовы getState(), например, при проверке условия и т.д. При повторном обращении может вернуться уже другое значение. У меня было в конце цикла:
if (target.getState()==State.TERMINATED) {
                isTerminated = true;
            }
Заменил target.getState() на переменную, хранящую инфо о состоянии, и всё стало ок)
Василий Бабин Мракоборец в ДурмстрангExpert
26 августа, 11:58
5 ошибок пока правильно не выставил вывод. То вроде у себя всё работает, а по факту не верно. Если неправильно сделать вывод (я через if и elsa делал) если сделаешь неверно, то при нескольких выводах может выскочить 2 раза TERMINATED. Как сказал ниже barracuda надо раз пять потестить вывод и если выводится только как у него, то тогда можно и отправить на валидацию.
barracuda 31 уровень, Санкт-Петербург Expert
25 июля, 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. 26 уровень, Санкт-Петербург
4 сентября, 07:42
можно короче и проще: не нужно заводить 2 переменные state, достаточно одной. Мы же можем получить состояние напрямую от thread.getState(). да и цикл не обязан быть бесконечным. Условие работы цикла: thread.getState() != State.TERMINATED Хотя, признаюсь, Ваше решение мне очень помогло.
Алексей 31 уровень, Чебоксары
28 сентября, 10:19
Если условием работы цикла выставить thread.getState() != State.TERMINATED, то состояние Terminated не будет выведено в консоль. Это касается конкретно решения barracuda. Но можно эту операцию вывести после цикла.
Юрий 27 уровень, Москва
22 ноября, 18:21
Блестяще!
Сафронов Алексей 31 уровень, Йошкар-Ола
25 мая, 13:32
Может кому поможет мое решение. В переопределяемом run() вызываем run() суперкласса. Создаем переменную (boolean) для выхода из цикла мониторинга, а также Arraylist строковых состояний нити. В цикле do-while в строковую переменную считываем текущий статус нити, далее проверяем есть ли значение данной переменной в Листе - если нет добавляем и печатаем его же в консоль. Далее сравниваем значение этой строковой переменной со значением "TERMINATED", и если оно такое булевая переменная меняет значение на маркер выхода из цикла do-while.
Иван Ганжа Backend Developer в ГосНИИАС
26 мая, 20:50
1.Зачем вызывать run супер класса? 2. Зачем создавать лист, если можно работать сразу с енумом? 3. Зачем логическая переменная, если можно сделать бесконечный цикл с брейком по треминатед?
Kex 38 уровень, Тольятти Expert
14 мая, 15:01
Задачка простая но нервы вытрепал валик, у кого то через switch - case прошло?
16 июля, 08:35
свич не нравится :( сделал все по красоте - не принимает
Alexey Prilessky 40 уровень, Минск
8 мая, 17:27
Задачу можно решить как минимум 3-мя способами, но валидатор хочет именно тот, где цикл останавливается в случае если state = TERMINATED
Евгений 41 уровень, Нижний Новгород Expert
14 апреля, 17:42
С первой попытки за 5 минут. Тут главное - не бояться и идти по своему внутреннему чувству. По сути алгоритм простейший: если состояние нити отличается от старого, выведите его на экран. Если состояние TERMINATED, закончите цикл.
Islam Laipanov 30 уровень, Москва
10 мая, 22:46
по своему внутреннему чувству можно погоду предсказывать, а в программировании лучше четко понимать, что ты делаешь)
Евгений 41 уровень, Нижний Новгород Expert
11 мая, 13:19
Ну конечно надо понимать, что ты делаешь, а кто-то спорит? К чему здесь вообще ваш комментарий?😐
Islam Laipanov 30 уровень, Москва
11 мая, 17:54
так, поумничать. тут все умничают
Ольга 32 уровень, Москва
18 мая, 14:07
спасибо за подсказку
Алексей Чумаков 35 уровень, Ногинск
28 июня, 10:09
Алгоритм простейший, отрабатывает но не проходит валидацию) P.S.Оказывается Terminated тоже надо выводить в консоль, а не сразу выходить
16 июля, 08:46
а у меня терминейтед не выводит почему то
Николай Тараданов 29 уровень, Новосибирск
4 ноября, 04:22
Спасибо за идею.
Oleksandr Myrko 40 уровень, Львов
2 апреля, 10:11
Мониторим в бесконечном цикле изменение состояния target, и рвем цикл когда его состояние станет равно INTERRUPTED
Wladyslaw 41 уровень, Warsaw Master
28 декабря 2019, 12:57
Насколько я понимаю многопоточность - задача не выполнена, в том виде в котором ее принимает валидатор. Ведь пока мы у себя в треде гоняем какую-то логику по поводу состояния таргета - его состояние может изменится и инфа уже будет не актуальна.