Java BlockingQueue take()vs poll()

时间:2014-04-30 04:19:37

标签: java concurrency queue blockingqueue

在无限循环中使用队列中的值时 - 效率会更高:

1)阻止队列,直到通过take()

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

2)睡眠n毫秒并检查物品是否可用

while (true) {

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

    Thread.sleep(1000);
}

2 个答案:

答案 0 :(得分:45)

阻止可能更有效率。在后台,如果没有可用元素,最初调用take()的线程将进入休眠状态,让其他线程执行他们需要做的任何事情。然后,添加元素到Queue的方法将在添加元素时唤醒等待线程,因此花费最少的时间一遍又一遍地检查队列是否有元素可用。

答案 1 :(得分:0)

使用take()时要小心。如果您正在使用服务中的take()并且服务具有数据库连接。

如果在过期连接超时后返回take(),则会抛出Stale连接异常。

对预定义的等待时间使用poll,并为返回的对象添加null检查。