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