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

  • 13
  • Недоступна
Cоздай класс нити LoggingStateThread, которая будет выводить в консоль все состояния (State) переданной в конструктор нити. Нить LoggingStateThread должна сама завершаться после остановки переданной в конструктор нити. Метод main не участвует в тестировании.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (66)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Vadim Krant26 уровень, Москва
среда, 14:00
Меня так увлекла задача что я за 3 минуты её решил, простой цикл который отслеживает предыдущее состояние и сравнивает с нынешним. Накололся с тем, что сделал демоном эту нить, неожиданно, но это не правильно, просто сами выключаем эту нить когда выходим за пределы цикла. 5694, 4.17
S3R3N1TY34 уровень, Санкт-Петербург
6 марта, 11:06
Почему если я в конструкторе нашего "Следящего" потока указал, что пускай он будет демоном
public LoggingStateThread(Thread thread) {
       logThread = thread;
       setDaemon(true); }
то он ведь должен автоматически завершиться если никаких других потоков больше не осталось, правильно ? А валидатору нужно this.Интеррапт прописать после цикла, чтобы принял. UPD: Понял, у нас к тому моменту, еще метод Main продолжает работать из-за строчки Thread.sleep(100); поэтому наш "Следящий логер" еще не откинул копыта, так как демону нужно чтобы все остальные потоки ушли на покой, тогда и он завершится.
Vitaly Khan37 уровень
31 декабря 2018, 00:33
первый раз с таким столкнулся. один и тот же код, валидатор то пропускает, то не пропускает!... (на Премиум Про можно несколько раз сдать задачу на проверку)
Vitaly Khan37 уровень
4 марта, 09:47
может, это связано с тем, что в моем решении вывод то:
NEW
RUNNABLE
TERMINATE
то:
NEW
RUNNABLE
TERMINATE
TERMINATE
Юрий41 уровень, Минск
6 марта, 19:42
это точно) надо добиться такого состояния что бы было только 3 записи
King41 уровень, Санкт-Петербург
14 ноября 2018, 14:50
Охренеть, я в шоке просто! Цитирую строчку из задания: "...которая будет выводить в консоль ВСЕ состояния (State) переданной в конструктор нити". Каким раком я должен был догадаться, что они должны выводиться без повторов?! ВСЕ в моём понимании - это ВСЕ!
Valeriy2941 уровень
1 ноября 2018, 22:24
опять куча попыток из за Валидатора. Не принял пока перед циклом не вывел состояние.
Andry Max35 уровень, Минск
22 августа 2018, 18:12
та ещё угадайка. зачем изучали демона не понятно.
Rodriguez33 уровень
10 августа 2018, 00:46
Валидатор не принимал решение, пока в конструкторе не прописал строчку: System.out.println(thread.getState());
Павел41 уровень, Санкт-Петербург
9 августа 2018, 21:49
State state, lastState = null;
do {
    state = target.getState();
    if (state != lastState) {
        System.out.println(state);
        lastState = state;
    }
} while (state != State.TERMINATED);
16 августа 2018, 13:13
мда, а вот про то что не надо выводить у проверяемой нити состояние, если оно не сменилось я не догадался, эххх.
Денис26 уровень
6 мая, 11:23
очень красивое решение! спасибо
Mark35 уровень, Санкт-Петербург
9 августа 2018, 18:40
к чему полумеры можно получить target.getState() второй строчкой в конструкторе .) няп это самая первая точка программы, где мы уже знаем входящую нить к тому же переменные нити-логеа уже объявлены и ждут инициализации
public LoggingStateThread(Thread target) {
    this.target = target;
    currentState = target.getState();
    System.out.println(currentState);
    }
таким образом мы гарантированно считаем состояние переданной нам нити еще до завершения работы конструктора нити-логгера, т.е. до запуска любой из нитей с демоном валидатор не принимает? какая ему собственно разница
Сергей36 уровень, Москва
6 июля 2018, 11:06
При наблюдении за нитью из другой нити можно пропустить получение нужных данных в зависимости от некоторых факторов, таких как: количества ядер, их загруженности, приоритетах и других проблем операционной системы. Я смотрю 74% людей, решавших эту задачку, как раз испытали на себе подобные проблемы. Я просто посоветую: - получить getState() сразу при входе в run() и записать ее в переменную - получить getState() сразу при входе в while(true) и записать ее в переменную потом уже сравнивать - вызов нескольких getState() в одном цикле тормозит проверку, состояние может поменяться в пределах одного шага цикла. Удачи!