Один для всех, все - для одного

  • 9
  • Недоступна
1. Разберись, как работает программа. 1.1. Обрати внимание, что объект Water - один для всех нитей. 2. Реализуй метод ourInterruptMethod, чтобы он прерывал все нити из threads. 3. В методе run исправь значения переменных: 3.1. isCurrentThreadInterrupted - должна равняться значению метода isInterrup
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (192)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Blynchik Работает в Pegas Touristik
8 июня, 06:22
Я что-то нажал и все получилось
SWK
Уровень 16
18 марта, 08:59
Алё! Администрация! Вот тут у народа есть мнение, что isCurrentThreadInterrupted нафиг не нужна. Мнение было высказано не раз. Мнение высказано давно, не менее года назад. Как согласным с мнением народа студентам (типа меня) узнать, нафига бессмысленную isCurrentThreadInterrupted вставляли в задачу? Хоть кто-нибудь на комментарии отвечает официально? Я точно знаю, что их читают, т.к. иногда удаляют фрагменты решения.
Damiankain
Уровень 19, Минск, Беларусь
2 февраля, 01:25
Может кто нибудь пояснить почему получается такой вывод: Объект water, нить #0 Объект water, нить #1 Объект water, нить #2 Объект water, нить #2 Объект water, нить #1 Объект water, нить #0 Объект water, нить #2 Объект water, нить #0 Объект water, нить #1 Process finished with exit code 0 Ведь мы добавляем 1 объект в список 3 раза и 3 раза его запускаем. Почему у нас 9 выводов?
Johnny
Уровень 29, Санкт-Петербург, Russian Federation
2 февраля, 16:53
На каждом витке цикла добавляется новый обьект нить (new Thread(water, "#" + i)). Слово new создаёт новый обьект. И за 3 секунды, которые спит метод main, каждая нить из списка threads успевает крутануть 3 раза цикл из метода run(), своего обьекта Water. 3*3=9
Sergey Lazchenko
Уровень 22, Ростов-на-Дону, Russian Federation
2 января, 19:18
Эх, как мне все так нравится одной строкой
threads.forEach(Thread::interrupt);
SWK
Уровень 16
18 марта, 08:48
1. Понты. 2. Неизученный материал. Что ещё хуже, чем понты.
Axtane
Уровень 27, Ставрополь, Russian Federation
20 апреля, 21:02
чел, прям коллажи уже делать здоровые можно, где ты пишешь людям "понты", что не так с ссылкой на метод через ::? Это проходили в первом квесте.
SWK
Уровень 16
22 апреля, 06:49
Дык, сделай уже хоть один коллаж, раз так внимательно следишь за моим творчеством! "В первом квесте" проходили лямбды??? Что "за первый квест" такой, почему я его не проходил? Вот я прохожу последовательно, все задачи делаю, ни одного теоретического урока про лямбды не припомню. У меня глюки, или это заговор рептилоидов? И про *.forEach(); не уверен. А вот это не понты:
for (Thread t : threads) {
    t.interrupt();
}
Если хочется одной строкой:
for (Thread t : threads) t.interrupt();
threads.forEach(Thread::interrupt);
Axtane
Уровень 27, Ставрополь, Russian Federation
22 апреля, 14:37
возможно ты изначально тест прошел тогда, что ты не с нуля занимаешься, либо начинал Syntax до переработки, не знаю -( Java Syntax, lvl 19, Лямбда-функции Да я без претензии, просто чуть токсично со стороны выглядит
Axtane
Уровень 27, Ставрополь, Russian Federation
22 апреля, 14:42
не помню наизусть лекции уровня конечно, но точно помню, что было упоминание ссылок на методы и forEach в доп лекциях, тут например
// Старый способ:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for(Integer n: list) {
    System.out.println(n);
}

// Новый способ:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list.forEach(n -> System.out.println(n));

// Новый способ с использованием оператора двойного двоеточия ::
list.forEach(System.out::println);
SWK
Уровень 16
26 апреля, 09:43
Это ссылка на статью. Статьи сами по себе лежат. Статьи не то же самое, что программа. В смысле, непонятно, когда откуда будет ссылка на ту статью. Кроме того, в ней есть про отличие лямбд от анонимных классов. А про анонимные классы, вроде, тоже не было пока "по программе". Скорее всего, попал ты туда по чьей-то ссылке из комментариев. Я, так-то, с прошлого октября постепенно прохожу, не сильно старую программу. А чудеса с уровнями потому, что давно зарегистрировался, но долго ничего не делал. Напишу-ка я в саппорт, не потерялась ли у меня видимость чего-нибудь.... Ну, блин, нет у меня в Java-синтаксисе 19 уровня, от слова "совсем". Только от 0 до 10.
Axtane
Уровень 27, Ставрополь, Russian Federation
8 мая, 14:49
да, по всей видимости 10 лвлов это как раз до переработки курса, когда конкретно она была не знаю, может быть администрация может сбросить первый квест, или как-то иначе решить потерю контента, хз
milyasow
Уровень 30, Москва, Russian Federation
18 мая, 11:47
Уже не первый, кто пишет о кислотности данного персонажа. "Понты", по сути и есть такое поведение: не разобравшись, и не прочитав комментарии, начинает на всех гнать, тут ему не так объяснили, тут ему не ту лекцию дали, тут он курс не с того начал, а все администрация виновата. Тысячи людей ежедневно здесь занимаются без каких-либо проблем, и лишь ему всё не то и всё не так. Пора бы уже понять, что это ресурс для САМОСТОЯТЕЛЬНОГО обучения, и никто не обязан вам все разжевывать и подносить в ложечке, как маленькому.
Сергей Коваленко
Уровень 37, Краснодар
2 января, 10:37
после этой задачи ссылки от профессора в статье в последнем примере аналогичная задача как раз объяснено про прерывание потока в режиме ожидания и что с этим можно сделать.
Гэндальф Серый Маг
10 декабря 2021, 07:31
Очень нравятся задачи, где я вроде понимаю, что надо делать, но надо немного вникнуть, поэксперементировать и погуглить, спасибо авторам!
Nikita Yudin
Уровень 37, Москва
17 ноября 2021, 19:56
Мне вот интересно, зачем надо останавливать каждую нить отдельно через цикл for? почему просто
Thread.currentThread().interrupt();
не работает?
БелК в труселях
Уровень 35, Покровск, Ukraine
20 ноября 2021, 20:55
Ага
Sergey Kornilov
Уровень 38, Petropavlovsk, Казахстан
3 ноября 2021, 12:40
Всего эту задачу решили 28394 учеников. В помощь Thread.currentThread()...
Владлен Backend Developer
12 сентября 2021, 14:06
У кого возникли сложности в решении данной задачи, предлагаю вот такие шаги сделать: 1. Нам надо реализовать метод urInterruptMethod(), который должен прервать все нити. Это сделаем простым for , где будет итерироваться List<Thread> threads, и для каждого threads делаем interrupt(). 2 Надо изменить переменную isCurrentThreadInterrupted , чтобы они прерывала текущую нить. Это сделать можно при помощи Thread.currentThread().isInterrupted(). 3 Чтобы получить имя текущей нити 'threadName', нам поможет Thread.currentThread().getName(); На этом состоит решение данной задачи.
Nik Grape
Уровень 48, Berkeley, United States
10 сентября 2021, 06:06
не правильно, наверное, использовать
!Thread.currentThread().isInterrupted()
в условии цикла особенно если внутри цикла есть
Thread.sleep()
поясняю Thread.sleep() вызывает не
 isInterraped()  ,а
interrupted()
который в свою очередь вернет флаг boolean isInterrupted в false
а значит стоит проверка на этот флаг в условии цикла
 или нет вообще ни на что не повлияет!
не верите? проверьте! поиграйте с задачей после валидации
цикл тут останавливается потому что
Thread.sleep() выкидывает исключение и мы попадаем в
блок catch попробуйте например в блоке catch распечатать
результат вызова isInterapted() у вашей нити
и увидите false не смотря на то что вы вызывали interrupt()
и подумайте как правильно использовать эти методы
может и хорошо что есть в задачах такие ошибки
потому что когда мы их замечаем мы уже точно эти мелочи не забудем
Anonymous #2749315 Frontend Developer
11 сентября 2021, 16:18
Тоже немного удивился этому условию в while. Наверное, так хотели обратить наше внимание, что могут быть ситуации, когда нить уже прервана ещё до цикла while. Но в данной задаче, имхо, хватило бы и while (true) {...}, ведь catch сработал бы, если что.
milyasow
Уровень 30, Москва, Russian Federation
18 мая, 19:44
Не вижу проблемы. Согласно документации: If this thread is blocked in an invocation of the wait(), wait(long), or wait(long, int) methods of the Object class, or of the join(), join(long), join(long, int), sleep(long), or sleep(long, int), methods of this class, then its interrupt status will be cleared and it will receive an InterruptedException. То все верно, флаг interrupt status сбрасывается, это и объясняет вывод false в блоке catch, но при этом вы получаете InterruptedException, и выходите из цикла while в блок catch (тем самым прерывая его).