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检查。