Аптека

  • 9
  • Недоступна
Реализуй интерфейс Runnable в классах Apteka и Person. Все нити должны работать пока не isStopped. Логика для Apteka: drugsController должен сделать закупку случайного лекарства (getRandomDrug) в количестве (getRandomCount) и подождать 300 мс. Логика для Person: drugsController должен сделать продаж
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (138)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Константин22 уровень, Москва
20 июня, 06:49
- Дайте 3 анальгина бошка раскалывается! - У нас 2 осталось. - Спасибо, не надо. Когда будет 3 куплю. :))
Ivan25 уровень, Нижний Новгород
1 июля, 11:45
У нас тут анальгина не хватает, закупим ка мы плацебо)
Павел22 уровень, Санкт-Петербург
29 мая, 19:27
int index = (int) ((Math.random() * 1000) % (drugsController.allDrugs.size()));
а что мы этим собираемся сделать? типо найти остаток от суммы размера мапа?
Игорь Ким31 уровень, Тольятти
31 мая, 03:53
Получаем случайный индекс в рамках размера drugsController.allDrugs.size. Остаток от деления % никогда не будет больше числа на которое делят
Павел22 уровень, Санкт-Петербург
31 мая, 09:23
так так так...а еще пару вопросов.... еще раз... почему именно остаток... получается рандом * 1000, всегда будет флоат? и почему именно на 1000 умножаем? и...каким образом у нас идет деление на случайный индекс? если не сложно можно по подробней... ну типо random * 1000 потому что то, то - то.. и т.д.. а то что то не понять...
Павел22 уровень, Санкт-Петербург
31 мая, 09:25
я вот много раз сделал рандомное умножение на 2 и постоянно примерно такое число получаю...1.8838320490651665 типо у рандома число только примерно не превышающее 1.1? эх
Игорь Ким31 уровень, Тольятти
3 июня, 08:59
Math.random возвращает случайное число от 0 до 1 тип Double. например 0.27792415361514944 чтобы можно его поделить с остатком умножаем на 1000(можно и на 100) получается 277.92415361514946 берем сайз списка и делим % с остатком, например на 3 получается остаток 1.9241536151494643 т.е этот остаток не получиться больше числа на которое мы делим Далее (int) преобразует в integer и отбрасывает часть после запятой получается 1
Павел22 уровень, Санкт-Петербург
3 июня, 09:43
большое спасибо за помощь))
Павел22 уровень, Санкт-Петербург
29 мая, 19:21
почему так не правильно? валидатор не принимает
waitAMoment();
               waitAMoment();
               waitAMoment();
ну вы поняли что это... из 100 сделать 300...как?
Павел22 уровень, Санкт-Петербург
29 мая, 19:23
пипец...проблема только лишь в этом... что за бред, даже в готовых ответах так написано
Ivan25 уровень, Нижний Новгород
1 июля, 11:46
нефиг "набор текста" прогуливать)
Павел25 уровень, Минск
29 июля, 08:37
у меня принял таким образом
Maxim24 уровень
4 мая, 04:50
Несколько вопросов по задаче: 1. Почему в данном случае переменную isStopped не нужно помечать как volatile? Значение переменной не копируется в кэш потоков? 2. Правильно ли я понимаю, что вызов синхронизированного метода у объекта полностью блокирует этот объект? Т.е. если один поток вызвал метод buy(), то другие потоки в этот момент не смогут вызвать метод sell()? 3. Почему метод getRandomCount() не нужно помечать как synchronized? В нем же идет обращение к переменной allDrugs, которая в этот может использоваться другими потоками в методах buy() и sell()?
6 мая, 10:49
1. По isStopped тоже непонятно.. по идее ее меняет любой поток и она не атомарна для других потоков. 2. да. для экземпляра класса происходит синхронизация. Мне кажется что здесь можно было бы ограничиться и синхронизацией allDrugs. 3. наверное потому что она просто должна вернуть случайное значение. Наш HashMap в статическом блоке получает три объекта. Далее эти объекты просто перезаписываются с новым значением что в bye, что в sell поэтому size всегда останется три элемента. и какой из этих трех мы вернем нам все равно... Данный метод нужно было бы синхронизировать, если бы при продаже удалялся бы элемент из мапы... имхо.
Nubas19 уровень, Новосибирск
11 мая, 19:13
не уверен, но могу предположить: 1. isStopped изменяет только 1 поток (main), поэтому не нужно 2. по умолчанию блокирует (this) 3. getRandomCount отдает число и вы сразу используете его в качестве аргумента метода sell/buy. При повторном вызове будет отдано другое псевдослучайное число, это нормально. А в allDrugs складываются вполне конкретные значения из статического блока, который вызывается первым и вносит эти значения.
Riccio35 уровень, Москва
2 мая, 14:44
Прочел задание. Всё, от начала и до конца, сверяя с написанным кодом. Добавил, буквально, пару строк. Не поверил. Стал читать код внимательнее. Ничего странного не нашел, всё просто и понятно. Прочел комментарии. Ничего не нашел. Прочел вопросы. Ничего не нашел. Нажал "Проверить" и сдал задачу с первого раза. Вот что значит: "Обжёгшись на молоке - дуешь на воду" :)))))))
Константин Петров18 уровень, Москва
7 августа, 08:56
Аналогично )))
DenisKa19 уровень, Екатеринбург
29 апреля, 17:32
захотелось анальгина
Семён22 уровень, Екатеринбург
13 апреля, 18:57
почему аптека закупает всё по 3 упаковки максимум? население так вымрет
Мишаня22 уровень
10 апреля, 09:25
Читайте требования перед сдачей задачи, нужно использовать метод waitAMoment(); иногда больше раза)
Павел22 уровень, Санкт-Петербург
29 мая, 19:23
так даже так не принимает, фор от 0 до 3...хотя не выполняется только это условие
Maxim Moskalyuk22 уровень, Санкт-Петербург
8 апреля, 09:21
Зачем было делать в условии задержку в 300мс и не давать сделать самому прописать это задержку, а нужно 3 раза вызывать метод waitAMoment(). Не понимаю...
Vgoose18 уровень, Москва
23 июля, 15:57
Тоже по этому поводу сюда пришел. Та ещё ересь метод несколько раз вызывать.
5 апреля, 14:07
Не можешь решить посмотри в комментарии - 1 балл. Не можешь решить и не смотрел в помощь посмотри в логика для: // ты быстро поймешь что куда - 2 балла. Не можешь решить, но разбери все задачу по составным (и подумай что на работе придется это делать самостоятельно) - 3 балла. Не решаешь задачу - 0 балов. Забросил = -1 балл.