Заметки

  • 9
  • Недоступна
Асинхронность выполнения нитей. 1. Класс Note будет использоваться нитями. 2. Создай public static нить NoteThread (Runnable не является нитью), которая в методе run 1000 раз (index = 0-999) сделает следующие действия: 2.1. Используя метод addNote добавит заметку с именем [getName() + "-Note" + inde
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (259)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Oraz Janov Backend Developer
30 апреля, 20:54
Стало интересно как с этой задачкой справится ChatGpt . Вот результат
Михаил Java Developer
15 апреля, 22:23
Вы решили задачу лучше, чем 42% учеников. Вам удалось ее решить с 1 попытки. Среднее количество попыток для этой задачи 2.03. Всего эту задачу решили 32673 учеников. Ваша награда: x9
Виктор
Уровень 29
27 марта, 09:43
Чтобы увидеть все варианты принтов описанных в методе removeNote() увеличьте Thread.sleep например до 10 милисекунд. В ином случае у меня одна из нитей вываливалась сразу с IndexOutOfBoundsException и дальше работала только одна нить.
Denys Sukhoivan
Уровень 26
Expert
14 марта, 11:44
Как я понял что такое index : Note.notes.get(i); Как надо было: i Ну епте))
Gans Electro
Уровень 36
13 марта, 07:30
ChatGPT: В приведенной реализации, метод removeNote использует notes.remove(0) для удаления первой заметки из списка. Однако, если notes пустой список, вызов метода remove(0) приведет к выбрасыванию исключения IndexOutOfBoundsException. Чтобы избежать этой ошибки, следует добавить проверку на пустоту списка перед вызовом метода remove(0).
Gans Electro
Уровень 36
13 марта, 07:39
Про условие if (note == null) "
Вы не видите в выводе это условие потому, что оно никогда не будет выполнено.
В методе removeNote строка String note = notes.remove(0) извлекает первый элемент из
списка notes и присваивает его переменной note. Если список notes пустой, то метод remove
вернет null. Однако, перед использованием переменной note в условном операторе if, она
проверяется на null с помощью if (note == null). Если note равен null, то условие в блоке if
будет выполнено и выведется сообщение "Другая нить удалила нашу заметку". Таким
образом, если вы не видите сообщение "Другая нить удалила нашу заметку", то список notes
никогда не был пустым во время выполнения программы.
"
Антон
Уровень 35
11 марта, 15:22
По условию реализовали что нужно, а как конкретно работает программа для многих осталось загадкой. Какой смысл в таких задачах? Посидеть с дебагом поковырять?
Anonymous #3227998
Уровень 32
24 мая, 03:29
Уже не первый раз ловлю на мысли себя, что иногда без прямого указания, на то, что же следовало понять из той или иной задачи, очень сложно составить себе картину того, а же что надо было из задачи вынести. Или то что котята у кошки не могут разбежаться не родившись, или что то еще сногсшибающее🤦‍♂️
Evgenii #3199250 Программер на 1С
20 ноября 2022, 11:27
Очередное задание из разряда "подгони ответ под валидатор". Вот так не пропускает
Thread thread = Thread.currentThread();
Note.addNote(thread.getName()+"-Note"+i);
...
Note.removeNote(thread.getName());
надо так:
Note.addNote(getName() + "-Note" + i);
Note.removeNote(getName());
Dima Darienko
Уровень 47
25 ноября 2022, 10:43
второй вариант лучше энивей
alexyng7
Уровень 22
13 марта, 11:14
Аналогично. Впустую потрачена попытка. Хотя смысл один и тот же.
Андрей Федоров Android Developer
1 ноября 2022, 15:17
7 попыток) Потому что я из Note сделал NoteThread )))
Daniel CEO в BicycleInventionAcad
12 декабря 2022, 22:15
8 Потому что sleep() валидатору не нравится. Нужен Thread.sleep()
Bingo Boom
Уровень 30
18 октября 2022, 13:52
По какой-то причине первый запуск у меня прошёл с ошибкой, а второй нормально
Иван Каптюк
Уровень 20
4 марта, 13:43
Аналогично)
Владимир
Уровень 47
7 октября 2022, 12:26
И не совсем понятна под какую ситуацию прописано:
if (note == null) System.out.println("Заметка удалена другим потоком");
Буду благодарен уважаемым коллегам за разъяснения
Daniel CEO в BicycleInventionAcad
12 декабря 2022, 22:20
В треде мы сначала создаем запись в коллекции, потом удаляем ее. Т.е. запись с индексом ноль должна быть единственной имеющейся до удаления. В первой строке метода удаления мы копируем значение записи в note и удаляем из коллекции. Если note равно null, значит элемент уже кто-то удалил в другом потоке. Тем самым нам показывают параллельную работу потоков по изменению состояния объекта и дают пример проблемы race condition, когда от порядка выполнения потоков планировщиком зависит итоговый результат работы кода.
18 января, 18:47
Этот момент я тоже не поняла и объяснения Daniel меня не устраивают (прости). Есть строка
String note = notes.remove(0);
В ней мы пытаемся удалить элемент из коллекции и присвоить его переменой note. Элементов null в коллекции быть не может, мы такие не добавляем (а вообще могут?, чет не помню я). Если нет элемента с индексом 0, то возникнет исключение IndexOutOfBoundsException, что собственно у меня в одной из нитей и произошло. Когда может возникнуть ситуация, что note==null. По моему скромному мнению никогда! Или?
Aquarus
Уровень 20
1 марта, 14:33
Daniel, спасибо, хорошо разжевал! А то что-то не совсем понял, что сделал (:
Aquarus
Уровень 20
1 марта, 14:36
Екатерина, "Если нет элемента с индексом 0..." да, вопрос в том, что мы получаем IndexOutOfBoundsException при remove(0) если в этот момент наш ArrayList пустой... ндя
Daniel CEO в BicycleInventionAcad
1 марта, 21:00
Или Конкретно в этой программе мы создаем два потока, которые работают с одной коллекцией (notes). И вот вам просто сценарий: первый поток поместил значение к воллекцию под нулевым индексом и заснул. В это время планировщик потоков включил второй поток. Тот перезаписал значение в нулевой индекс и тоже заснул. Первая нить ремувнула запись, которая была помещена в общую коллекцию второй нитью и вывела в консоль, что удалила чужую запись. После этого опять проснулась вторая нить, попыталась удалить нулевой элемент из листа, а его там нет, потому что до этого его уже ремувнули. Вот мы и получаем ситуацию, когда нулевой индекс коллекции не содержит в себе никакой ссылки, а значит там хранится null (значение по умолчанию). Для того чтобы избежать такой ситуации нужно синхронизировать работу с общими ресурсами. Об этом можно узнать в блоке по многопоточности.