Java中的BlockingQueue中的put(s)和take(s)是什么意思?

4

这里有一个例子。

class Factory {
    Queue<Object> queue = new LinkedBlockingQueue<Object>();

    public Object consume() {
        queue.take();
    }

    public void produce() {
        for (int i = 0; i < 2; i++) {
            queue.put(new Object());
        }
    }
}

例如,我有两个线程都调用consume()方法。它们正在等待生产者将某些内容放入队列中。我的问题是,在put()操作之后是否会发生take()操作,或者可能会连续发生两个put()操作,然后等待的线程才会返回?
谢谢。

1
BlockingQueue 是一个接口。在任何情况下,不要假设线程的顺序。最有可能的是 take() 会在 put() 之后发生 - 但也有可能被 put() 唤醒的线程会被其他的 put() 先抢先一步。 - Boris the Spider
1个回答

1
一旦放置完成,锁就被释放了。现在假设放置和取出都在等待该锁,而且这是一个不公平的锁,那么 Put/Take 方法中的任何一个都可以获取锁并开始执行。 除非特别指定,否则监视器(锁)没有有序和交替的交换。 请查看 Java 代码。 ArrayBlockingQueue ReentrantLock AbstractQueuedSynchronizer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接