2011-10-08 3 views
4

Я понимаю, что наличие всасывания нитей для элементов BlockingQueue с использованием take()method будет ждать появления элемента (если только он не прерывается).Должен ли я явно просыпать поток, всасывающий BlockingQueue.take() для производительности?

У меня есть два вопроса:

I) Является ли нить автоматически разбудили вверх, как только элемент становится доступным или есть задержки (то есть нить сама позже чеки)?

ii) Если есть задержка, имеет ли смысл пробудить поток (например, путем прерывания его явно)? Я думаю о латентности и производительности.

ответ

4

Дополнительной задержки не предусмотрено. Вызов метода возвращает, если элемент доступен или поток прерывается.

Retrieves and removes the head of this queue, waiting if necessary until an element becomes available. 

Returns: 
    the head of this queue 
Throws: 
    InterruptedException - if interrupted while waiting 

The BlockinQueue делает это автоматически (осущ. Из ArrayBlockingQueue).

// in add etc. 
notEmpty.signal(); 

// in take() 
while(count == 0) 
    notEmpty.await(); 
+0

@DownVoter: Оставьте комментарий. – MasterCassim

+0

Я могу только предположить, что downvoter, (нет, не был мне :), возражает против «Нет задержки» - может быть задержка планирования. Потребительский поток готов, когда производитель отправляет элемент, но не будет работать сразу, если набор готовых/работающих потоков с более высоким приоритетом, чем потребитель, имеет одинаковые или более элементы, чем количество ядер. В любом случае, прерывание или другое такое возиться с нитью ничего не изменит. Единственный способ свести к минимуму любую задержку - обеспечить, чтобы у потребителя был достаточно высокий приоритет. –

+0

спасибо за объяснение. Я отредактировал свой ответ, потому что я ссылался на дополнительную задержку, которую можно было бы ускорить. – MasterCassim

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