gpt4 book ai didi

java - ArrayBlockingQueue 超出给定容量

转载 作者:行者123 更新时间:2023-11-30 06:27:54 25 4
gpt4 key购买 nike

我编写了解决有界生产者和消费者问题的程序。在构造 ArrayBlockingQueue 时,我定义了容量 100。我正在使用方法 take 和 put inside threads。而且我注意到有时我会看到 102 次,它们之间有任何一次。为什么会这样?

生产者运行方法:

public void run() {
Object e = new Object();
while(true) {
try {
queue.put(e);
} catch (InterruptedException w) {
System.out.println("Oj, nie wyszlo, nie bij");
}
System.out.println("Element added");

}
}

消费者运行方法:

public void run() {
while(true) {
try {
queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Element removed");
}
}

文件中 uniq -c 的部分输出:

102 Element removed
102 Element added
102 Element removed
102 Element added
102 Element removed
102 Element added
102 Element removed
102 Element added
102 Element removed
102 Element added
102 Element removed
102 Element added
2 Element removed
2 Element added
102 Element removed
102 Element added

最佳答案

I defined capacity 100. I'm using methods take and put inside threads. And I've noticed that sometimes I see put 102 times with any take's between them. Why does it happen?

这很可能是输出中竞态条件的副产品,而不是暗示阻塞队列在队列中有超过 100 个条目。 一个元素被放入队列后,一个线程可能会从队列中删除一些东西,但是在 putter 可以显示“添加” 消息——反之亦然。队列调用和 System.out.println(...) 之间没有锁定,因此不能保证顺序。

如果有任何问题,请打印出 queue.size() 以查看它是否超过 100。ArrayBlockingQueue 永远不会向您显示。

关于java - ArrayBlockingQueue 超出给定容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13040521/

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