многопоточная синхронизация Java с очередью ожидания - PullRequest
0 голосов
/ 02 февраля 2011

У меня проблема с многопоточностью Java, давайте посмотрим сценарий: 1 Сервер потоков (локально, разделяемая память - это просто симуляция)

class server extends Thead
syncronized public operation1
synchronized public operation2

....... public operationX

с методом запуска, чтобы решить, какие op1, op2..opX "включить"

3 Поток клиента - class client extend Thread

клиентский вызов направляет op1, op2..opX в тот же серверный поток (offcourse), созданный и переданный main..Так op1, opX выполняются на клиентском сервере, это не серверный поток, чтобы выполнить его ..

поэтому после того, как все серверы в методе run решат включить или отключить op1, op2..opX. Клиент в методе run просто вызывает serverreference.op1 () ..... serverref.opX ()

ОК. Теперь предположим, что все 3 клиентских вызова op1, которые не включены сервером, должны подождать (), а затем кто-то другой должен уведомить () ... Но мне нужно обработать эти уведомления FIFO. И сообщите, не запускайте в fifo, подождите, пока он только что подхватил ОДНУ приостановленную нить ..

Какую утилиту я могу использовать для обработки этой ситуации?

Спасибо в совете.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2011

Возможно, вы захотите использовать очередь блокировки. Возможно, синхронная очередь в вашем случае.

Расширить вашу модель, чтобы определить объект операции (запрос). Затем потоки будут пытаться добавить свой запрос в очередь. Тем временем серверный поток (если я правильно понимаю) будет пытаться получить запросы из очереди и обработать их.

Синхронная очередь - это просто блокирующая очередь с ограничением размера 0. Это означает, что каждый раз, когда поток пытается добавить в очередь, он блокируется, пока другой поток не попытается извлечь элемент из этой очереди. Если какие-либо потоки других делают то же самое, они также блокируются (есть варианты для настроек справедливости).

Если операции не отправляются, то поток сервера блокируется до тех пор, пока одна из них не станет доступной.

Обратите внимание, что это может привести к выполнению операций в потоке сервера (основной?). Если это не то, что вам нужно, вы можете дополнительно передать их Исполнителю для запуска в одном или нескольких потоках. Это может звучать как много накладных расходов, но это совсем не так.

JavaDocs:

1 голос
/ 02 февраля 2011

это может помочь:

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/LockSupport.html

посмотрите на пример использования.

0 голосов
/ 02 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...