Java BlockingQueue take()vs poll()
在无限循环中使用队列中的值时 – 更有效:
1)阻止队列,直到通过take()获得值
while (value = queue.take()) { doSomething(value); }
2)睡眠n毫秒并检查物品是否可用
while (true) { if ((value = queue.poll()) != null) { doSomething(value); } Thread.sleep(1000); }
阻止可能更有效。 在后台,如果没有可用的元素,最初调用take()
的线程将进入hibernate状态,让其他线程执行他们需要做的任何事情。 然后,添加元素到Queue的方法将在添加元素时唤醒等待的线程,因此花费最少的时间一遍又一遍地检查队列是否有元素可用。
使用take()
时要小心。 如果您正在使用来自服务的take()
并且服务具有数据库连接。
如果在过时连接超时后返回take()
,则会抛出Stale连接exception。
对预定义的等待时间使用poll,并为返回的对象添加null检查。