Java BlockingQueue take() vs poll()

六月ゝ 毕业季﹏ 提交于 2019-11-27 00:59:14

问题


When consuming values from a Queue in an infinite loop -- what would be more efficient:

1) Blocking on the Queue until a value is available via take()

while (value = queue.take()) { doSomething(value); }

2) Sleeping for n milliseconds and checking if an item is available

while (true) {

    if ((value = queue.poll()) != null) { doSomething(value); }

    Thread.sleep(1000);
}

回答1:


Blocking is likely more efficient. In the background, the thread that initially calls take() goes to sleep if there is no element available, letting other threads do whatever they need to do. The methods that add elements to the Queue will then wake up waiting threads when an element is added, so minimal time is spent checking the queue over and over again for whether an element is available.




回答2:


Be careful when you use take(). If you are using take() from a service and service has db connection.

If take() is returned after stale connection time out period then it will throw Stale connection exception.

Use poll for predefined waiting time and add null check for returned object.



来源:https://stackoverflow.com/questions/23379623/java-blockingqueue-take-vs-poll

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!