Должен ли я явно разбудить поток, сосущий BlockingQueue.take () для производительности? - PullRequest
4 голосов
/ 08 октября 2011

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

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

i) Поток автоматически активируется, как только элемент становится доступным, или есть задержка (т. Е. Поток проверяет себя позже)?

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

1 Ответ

4 голосов
/ 08 октября 2011

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

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

BlockinQueue делает это автоматически (включая ArrayBlockingQueue).

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

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