Java BlockingQueue take() vs poll()

2022-09-01 05:56:54

在无限循环中使用队列中的值时 -- 什么会更有效:

1) 在队列上阻塞,直到通过 take() 获得值

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

2)休眠n毫秒并检查项目是否可用

while (true) {

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

    Thread.sleep(1000);
}

答案 1

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


答案 2

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

如果在过时的连接超时期限后返回,则它将引发过时的连接异常。take()

对预定义的等待时间使用轮询,并对返回的对象添加空检查。


推荐