【问题标题】:Does add() on LinkedBlockingQueue notify waiting threads?LinkedBlockingQueue 上的 add() 是否通知等待线程?
【发布时间】:2010-06-06 23:42:16
【问题描述】:

我有一个消费者线程从LinkedBlockingQueue 中获取元素,当它为空时我手动让它休眠。我使用peek() 来查看队列是否为空,因为我必须在让线程进入睡眠状态之前做一些事情,而我使用queue.wait() 来做这件事。


那么,当我在另一个线程中并且add()队列中的一个元素时,是否会自动通知队列中wait()ing 的线程?

【问题讨论】:

    标签: java multithreading locking queue


    【解决方案1】:

    是的。或者更确切地说,它确实使用了更高效的内部锁对象,而不是外部队列对象的锁;如果你想睡觉直到队列中有东西到达,请阻塞take()。 (如果您在等待时还有其他事情要做,请考虑阻塞队列是否是从其他地方接收消息的正确方式。)

    【讨论】:

    • 它内部实际上有两个锁,一个处理队列空情况的通知,另一个处理队列满情况的通知。他们是 private — 有充分的理由 — 所以使用 API,因为它应该被使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多