4
據我所知,使用take()
method吸附元素BlockingQueue
的線程將等待元素可用(除非被中斷)。我應該明確地喚醒一個線程吸引BlockingQueue.take()來獲得性能嗎?
我有兩個問題:
i)是線程自動喚醒的儘快元素變得可用,或是否有延遲(即線程檢查本身更高版本)? ii)如果存在延遲,喚醒線程是否有意義(例如通過明確中斷它)?我正在考慮延遲和性能。
據我所知,使用take()
method吸附元素BlockingQueue
的線程將等待元素可用(除非被中斷)。我應該明確地喚醒一個線程吸引BlockingQueue.take()來獲得性能嗎?
我有兩個問題:
i)是線程自動喚醒的儘快元素變得可用,或是否有延遲(即線程檢查本身更高版本)? ii)如果存在延遲,喚醒線程是否有意義(例如通過明確中斷它)?我正在考慮延遲和性能。
沒有額外的延遲。如果元素可用或線程中斷,則方法調用返回。
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
自動這樣做(implement執行。的ArrayBlockingQueue
)。
// in add etc.
notEmpty.signal();
// in take()
while(count == 0)
notEmpty.await();
@DownVoter:請留下評論。 – MasterCassim
我只能假設downvoter(不,不是我:),反對'沒有延遲' - 可能會有一個調度延遲。消費者線程在生產者發佈項目時已準備好,但如果比消費者更高優先級的就緒/運行線程的集合具有與核心數量相同或更多的元素,則不會立即運行。無論哪種方式,中斷或其他這樣的線程擺弄不會改變任何東西。減少延遲的唯一方法是確保消費者具有足夠高的優先級。 –
感謝您的解釋。我編輯了我的答案,因爲我指的是可能加速的額外延遲。 – MasterCassim