Java BlockingQueue take()vs poll()

isa*_*pir 26 java queue concurrency blockingqueue

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

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

while (value = queue.take()) { doSomething(value); }
Run Code Online (Sandbox Code Playgroud)

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

while (true) {

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

    Thread.sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

awk*_*ksp 49

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

  • 最好使用具有超时的解决方案,以便在不确定的时刻阻止线程.因此,一个好的实现是使用`poll(timeout,unit)`特别是如果线程由ThreadPool运行并等待其他任务执行. (15认同)
  • @Pierrick,但是 `take()` 本质上不是在休眠它应该的确切时间(即直到有另一个任务可以执行)吗?在我看来,“poll(timeout,unit)”会实现同样的效果,只不过它会唤醒并执行不必要的检查。 (3认同)