在无限循环中使用队列中的值时--哪个更有效:
1)通过take()阻塞队列,直到有值可用
while (value = queue.take()) { doSomething(value); }
2)休眠n毫秒,检查商品是否可用
while (true) {
if ((value = queue.poll()) != null) { doSomething(value); }
Thread.sleep(1000);
}
发布于 2014-04-30 12:29:31
阻塞可能更有效。在后台,如果没有可用的元素,最初调用take()
的线程就会进入睡眠状态,让其他线程做它们需要做的任何事情。将元素添加到队列的方法将在添加元素时唤醒等待的线程,因此只需花费最少的时间反复检查队列中是否有元素可用。
发布于 2017-11-14 11:44:40
使用take()
时要小心。如果您从服务使用take()
,并且服务具有数据库连接。
如果在陈旧连接超时后返回take()
,则会抛出陈旧连接异常。
对预定义的等待时间使用轮询,并对返回的对象添加null检查。
https://stackoverflow.com/questions/23379623
复制相似问题