BlockingQueue 是否有最大阻塞时间
Is there a max blocking time on BlockingQueue
在生产者-消费者问题中,我想使用LinkedBlockingQueue
作为共享缓冲区。
生产者线程使用 put()
方法将元素放入队列,消费者线程使用 take()
方法使用队列中的元素。
我的问题是:如果队列为空并且消费者线程调用 take()
方法,我知道线程被阻塞,直到生产者将一个元素放入队列。但是是否有类似最大块持续时间的东西?我可以安全地假设消费者线程将被阻塞直到 put()
调用吗?
我听说有人说没有什么比永远的块。是真的吗?
不,take()
方法中没有等待超时。 documentation 没有提到任何超时:
Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.
另一方面,poll
方法可以将超时作为参数。
如果你看一下LinkedBlockingQueue的take()方法的实现
它在循环中等待 notEmpty 条件,只有当计数变为非零时才会退出。
所以是的,它将永远等待直到条件满足,这意味着有人将元素放在那里。
在生产者-消费者问题中,我想使用LinkedBlockingQueue
作为共享缓冲区。
生产者线程使用 put()
方法将元素放入队列,消费者线程使用 take()
方法使用队列中的元素。
我的问题是:如果队列为空并且消费者线程调用 take()
方法,我知道线程被阻塞,直到生产者将一个元素放入队列。但是是否有类似最大块持续时间的东西?我可以安全地假设消费者线程将被阻塞直到 put()
调用吗?
我听说有人说没有什么比永远的块。是真的吗?
不,take()
方法中没有等待超时。 documentation 没有提到任何超时:
Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.
另一方面,poll
方法可以将超时作为参数。
如果你看一下LinkedBlockingQueue的take()方法的实现 它在循环中等待 notEmpty 条件,只有当计数变为非零时才会退出。
所以是的,它将永远等待直到条件满足,这意味着有人将元素放在那里。