![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Loginanton |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 8.11.2007 Репутация: нет Всего: нет |
Добрый день. Помогите пожалуйста сделать лабу в универ. Конкретно неполучается сделать следующее: есть следующий класс:
Требуется сделать цикл (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 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 3.8.2007 Репутация: 1 Всего: 1 |
Не вижу в приведенном коде даже попытки сделать синхронизацию.
|
|||
|
||||
Loginanton |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 8.11.2007 Репутация: нет Всего: нет |
Вот код, который на данный момент:
|
|||
|
||||
mantracoder |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 3.8.2007 Репутация: 1 Всего: 1 |
|
||||||||
|
|||||||||
Loginanton |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 8.11.2007 Репутация: нет Всего: нет |
mantracoder, это немного не то. Во первых данные в Buffer должны хранится в простом типе данных, а не в List. Во вторых нельзя проверять записано что то в Buffer или нет.
|
|||
|
||||
mantracoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 3.8.2007 Репутация: 1 Всего: 1 |
1) Если значение буфера будет хранится в простом типе, то что произойдет, если Writer успеет записать в буфер более 1 значения, прежде чем Reader соизволит прочитаеть? 2) Reader не проверяет, есть ли значение в буфере. Проверяет сам Buffer, в противном случае, как вы определите, что поток должен ждать? Сообственно, пример у вас есть, допиливайте его по своему усмотрению. |
|||
|
||||
nc30 |
|
||||||||
![]() Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Loginanton,
Синхронизация всех действий происходит в объекте Buffer. Переменная available - для предотвращения дедлока. P.S. Автор кода AntonSaburov + я подогнал немного под задачу. Это сообщение отредактировал(а) nc30 - 2.11.2010, 17:16 |
||||||||
|
|||||||||
Loginanton |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 8.11.2007 Репутация: нет Всего: нет |
Нужно чтобы Reader и Writer работали поочереди, как бы передавая друг другу эстафетную палочку - вот этого я лично никак добиться немогу.
|
|||
|
||||
nc30 |
|
|||
![]() Интересующийся :) ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 24.6.2010 Где: Санкт-Петербург Репутация: 5 Всего: 8 |
Loginanton,
Они и так работают поочереди. Buffer лишь обеспечивает хранение полезного значения и безопасный доступ к нему. Не поленитесь скомпилировать код и посмотреть на результаты его работы: там все прозрачно. Не очень понимаю, что вас конкретно не устраивает. Не нравятся методы в Buffer? Они спроектированы с учетом защиты от deadlock. Считайте их потокобезопасными сетером и гетером для хранящегося там полезного значения. Если вы переместите эти методы в потоковые классы и откроете доступ к хранящемуся в буфере значению, то ни о какой потокобезопасности говорить не придется. Смущает обилие вывода на консоль объектом класса Buffer? Это сделано для того, чтобы вы понимали суть происходящих в программе нелинейных процессов. Разобравшись, вы можете безболезненно удалить ненужные вам вызовы println(), оставив чистую функциональность (хотя в этом случае пример потеряет в наглядности). Удачи ![]() Это сообщение отредактировал(а) nc30 - 3.11.2010, 05:47 |
|||
|
||||
alexsaltykov |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 17.8.2007 Репутация: нет Всего: нет |
Внесу свои 5 копеек
У меня без deadlock попроще конечно, но вроде работает.
|
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |