2012-06-25 4 views
0

У меня есть два потока. Один из них - клиент, а другой - продукт.Как смоделировать функцию блокировки с помощью Java

Я хочу вызвать функцию у клиента под названием READ. Это должно блокироваться бесконечно, пока производитель не поместит на него данные.

Как я могу это сделать? Спасибо!

+2

[Что вы пытались?] (http://whathaveyoutried.com) –

+0

Использование блоков синхронизации, но было занято в ожидании – bratao

ответ

5

Я бы рекомендовал вам использовать LinkedBlockingQueue. Это самый простой способ моделирования проблемы «производитель-консумент». Один поток помещает значения в очередь с использованием метода put, а другой потребляет данные, используя take, который блокирует (поток ждет, пока очередь не будет пустой). Использование LinkedBlockingQueue очень просто, потому что вам не нужно синхронизировать свои методы. Все уже сделано.

+0

Да ... нет необходимости изобретать велосипеды. (Особенно квадратные, которые используют ожидание.) –

+0

На самом деле, я думаю, что любой 'BlockingQueue' будет делать, не так ли? – OldCurmudgeon

+1

Overkill для этого. Вы можете использовать ReentrantLock или Sempahore, оба из которых являются гораздо более простыми подходами и будут иметь больше смысла для кого-то, читающего код. – Matt

-3

Использовать thread.wait(), а затем thread.notify(). thread.wait() ждет до thread.notify().

+0

уведомлять или уведомлять все? Как насчет мониторов? и т. д. Это очень низкий уровень, и его следует избегать, если это возможно. – assylias

+0

-1 - И если «уведомление» происходит сначала, весь процесс выходит из строя. Когда люди перестанут рекомендовать архаичные и сломанные решения уже разрешенных проблем !!! – OldCurmudgeon

2

если данные, которые должны быть помещены в очередь, требуют синхронизации, то есть производитель создает один объект и сохраняет его в очереди; потребитель должен взять объект, поставленный производителем, используя SynchronousQueue или новую TransferQueue, должна быть лучшая идея.

Смежные вопросы