Как проверить, заблокирован ли ArrayBlockingQueue или элемент очереди обработан потоком? - PullRequest
0 голосов
/ 23 мая 2011

Привет, мне интересно, есть ли какой-нибудь способ проверить, заблокирован ли в данный момент запрос ArrayBlockingQuery? Причина этого: у меня есть сервер, который слушает сокет, получает параметры, обрабатывает их и затем возвращает клиенту какой-то результат. Этот сервер (допустим, это сервер A) при обработке параметров открывает сеанс с другим сервером (сервером B), а затем отправляет информацию в B. При подключении к B может быть создан только один сеанс, но A может принимать несколько клиентских подключений. Из-за этого ArrayBlockingQueue используется для хранения этих параметров, а некоторые другие потоки проходят через очередь и отправляют их один за другим в B.

Мне нужно сделать эту функцию - когда ArrayBlockingQueue пуст и в текущий момент ничего не обрабатывается, а данные клиента отправляются в A, а затем обрабатываются немедленно - отправляют данные на сервер B, обрабатывают ответ от B и затем возвращают ответ клиенту, если ArrayBlockingQuery не пусто, и что-то обрабатывается, затем просто добавьте параметры в очередь и отправьте другой ответ от A клиенту. Вот почему мне нужно знать, есть ли способ проверить, заблокирован ли ArrayBlockingQueue или элемент очереди в настоящий момент обрабатывается потоком.

Спасибо!

Ответы [ 3 ]

1 голос
/ 23 мая 2011

Я бы посоветовал не применять то, что вы описали. Это сделает код намного более сложным и откроет условия гонки, если вы не синхронизируете большие части и действительно думаете о том, что делаете. Гораздо лучше всегда обрабатывать все события одинаково, то есть всегда в очереди, даже если «рабочий поток» простаивает. Затем он отключится и будет работать как обычно.

Ваша проблема, однако, может быть решена путем обновления «рабочего потока» / использования Семафор . Затем вы можете проверить, был ли приобретен семафон или нет. (Проверяя имеющиеся разрешения)

1 голос
/ 23 мая 2011

Есть ли причина, по которой вы не просто используете блокировку, так как она предназначена для защиты ресурсов, которые могут использоваться только в одном потоке за раз.

// in a client connection thread
lock.lock();
try {
    // use connection to server B
} finally {
    lock.unlock();
}

Это гарантирует, что сервер B будет толькоиспользовать по одному потоку за раз, и вам не нужно ничего добавлять в очередь.


Не уверен, что такое ArrayBlockingQuery, как и Google.Вы имеете в виду ArrayBlockingQueue?

ArrayBlockingQueue не блокируется очень долго, поэтому эта информация не очень полезна.Однако вы можете получить блокировку с помощью отражения.

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

Вы хотите, чтобы сервер B получал соединение только по одному, и вы используете очередь для этого, однако вы хотите обойти это, но это означает, что вы отказываетесь от своего соединения впринцип времени.

0 голосов
/ 23 мая 2011

Если вы имеете в виду ArrayBlockingQueue, у него есть (неблокирующий) метод peek(), который

Извлекает, но не удаляет заголовок этой очереди, или возвращает ноль, если эта очередь пуста.

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