Woj*_*ski 2 java concurrency capacity java.util.concurrent
我写过程序解决有限的生产者和消费者问题.构建ArrayBlockingQueue我定义的容量100.我正在使用方法take并放入内部线程.而且我注意到有时候我会看到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");
}
}
Run Code Online (Sandbox Code Playgroud)
消费者运行方法:
public void run() {
while(true) {
try {
queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Element removed");
}
}
Run Code Online (Sandbox Code Playgroud)
部分带有输出的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
Run Code Online (Sandbox Code Playgroud)
这很可能是输出中竞争条件的副产品,而不是暗示阻塞队列在队列中有超过100个条目.将元素放入队列后,线程可能会从队列中删除某些内容,但在推杆显示"removed"消息之前显示"added"消息 - 反之亦然.队列调用之间没有锁定,System.out.println(...)因此无法保证顺序.
如果有任何问题,请打印出来queue.size()以确定它是否超过100.我强烈怀疑这ArrayBlockingQueue是否会告诉你.