gpt4 book ai didi

java - 为什么 ArrayBlockingQueue 在队列满的时候还没有被阻塞

转载 作者:行者123 更新时间:2023-11-30 10:12:37 24 4
gpt4 key购买 nike

我有一个简单的 ArrayBlockingQueue 测试如下:

public class TestQueue {

static class Producer implements Runnable {
private ArrayBlockingQueue<Integer> queue;
private int index;

public Producer(ArrayBlockingQueue<Integer> queue, int index) {
this.queue = queue;
this.index = index;
}

@Override
public void run() {
try {
queue.put(index);

System.out.println("producer: " + index);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

static class Consumer implements Runnable {
private ArrayBlockingQueue<Integer> queue;

public Consumer(ArrayBlockingQueue<Integer> queue) {
this.queue = queue;
}

@Override
public void run() {
try {
while(true) {
System.out.println("consumer: " + queue.take());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(3);

for (int i = 0; i < 10; i++) {
Producer producer = new Producer(queue, i);

new Thread(producer).start();
}

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

Consumer consumer = new Consumer(queue);

new Thread(consumer).start();
}
}

结果是:

producer: 2
producer: 0
producer: 1
consumer: 0
producer: 4
producer: 6
consumer: 2
etc...

我的问题是,我定义了ArrayBlockingQueue的size为3,而producer将2、0、1共3个item放入队列,现在队列已满,那么consumer消费了0,现在队列的大小应该是2,然后生产者往队列里放了4,现在队列应该满了,为什么生产者还能往队列里放6,应该是阻塞了

最佳答案

take/put Action 和打印不是原子的。

producer: 6 打印在consumer: 2之前,并不代表生产者把6放在消费者消费2之前。

例如:

  1. 消费者执行queue.take(),取2
  2. 生产者执行queue.put(6)
  3. 制作人打印制作人:6
  4. 消费者品脱 消费者:2

关于java - 为什么 ArrayBlockingQueue 在队列满的时候还没有被阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51807682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com