Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Задача производитель-потребитель |
Автор: Loginanton 2.11.2010, 13:53 | ||
Добрый день. Помогите пожалуйста сделать лабу в универ. Конкретно неполучается сделать следующее: есть следующий класс:
Требуется сделать цикл (100 итераций) в котором один поток (я его назвал Writer) записывает в класс Buffer рандомное число от 1 до 9 и засыпает (Thread.sleep()) на такое число секунд, а другой поток (его я обозвал Reader) читает число из класса Buffer и к примеру выводит на экран. Т.е. должно быть так: Writer записывает в Buffer число, к примеру 4 и засыпает на 4 сек; пока Writer спит Reader должен прочесть из Buffer число и вывести его, а дальше ждать пока Writer снова не запишет в Buffer число, ну и т.д. Для синхронизации потоков (Writer и Reader) нужно использовать synchronized, wait(), notify(); а проверять пуст ли Buffer нельзя. Вот с синхронизацией и проблемы, пока никак победить немогу. Заранее благодарен за помощь. |
Автор: mantracoder 2.11.2010, 14:05 |
Не вижу в приведенном коде даже попытки сделать синхронизацию. |
Автор: Loginanton 2.11.2010, 14:55 | ||
Вот код, который на данный момент:
|
Автор: mantracoder 2.11.2010, 15:08 | ||||||||
|
Автор: Loginanton 2.11.2010, 15:25 |
mantracoder, это немного не то. Во первых данные в Buffer должны хранится в простом типе данных, а не в List. Во вторых нельзя проверять записано что то в Buffer или нет. |
Автор: mantracoder 2.11.2010, 15:36 | ||
1) Если значение буфера будет хранится в простом типе, то что произойдет, если Writer успеет записать в буфер более 1 значения, прежде чем Reader соизволит прочитаеть? 2) Reader не проверяет, есть ли значение в буфере. Проверяет сам Buffer, в противном случае, как вы определите, что поток должен ждать? Сообственно, пример у вас есть, допиливайте его по своему усмотрению. |
Автор: nc30 2.11.2010, 17:07 | ||||||||
Loginanton,
Синхронизация всех действий происходит в объекте Buffer. Переменная available - для предотвращения дедлока. P.S. Автор кода AntonSaburov + я подогнал немного под задачу. |
Автор: Loginanton 2.11.2010, 17:17 |
Нужно чтобы Reader и Writer работали поочереди, как бы передавая друг другу эстафетную палочку - вот этого я лично никак добиться немогу. |
Автор: nc30 2.11.2010, 18:36 |
Loginanton, Они и так работают поочереди. Buffer лишь обеспечивает хранение полезного значения и безопасный доступ к нему. Не поленитесь скомпилировать код и посмотреть на результаты его работы: там все прозрачно. Не очень понимаю, что вас конкретно не устраивает. Не нравятся методы в Buffer? Они спроектированы с учетом защиты от deadlock. Считайте их потокобезопасными сетером и гетером для хранящегося там полезного значения. Если вы переместите эти методы в потоковые классы и откроете доступ к хранящемуся в буфере значению, то ни о какой потокобезопасности говорить не придется. Смущает обилие вывода на консоль объектом класса Buffer? Это сделано для того, чтобы вы понимали суть происходящих в программе нелинейных процессов. Разобравшись, вы можете безболезненно удалить ненужные вам вызовы println(), оставив чистую функциональность (хотя в этом случае пример потеряет в наглядности). Удачи ![]() |
Автор: alexsaltykov 3.11.2010, 09:43 | ||||||||
Внесу свои 5 копеек У меня без deadlock попроще конечно, но вроде работает.
|