<分区>
我将 BQ 的初始容量设置为 3。但有时生产者会超出初始容量。请引用输出。
问题更新: ArrayBlockingQueue 使用显式锁来保证线程安全,但在代码中我获取了 sharedResource 对象的监视器/隐式锁。
如何将 System.out.println("Produce : "+d);
作为同一个显式锁的一部分?/如何使用相同的 BQ 锁实现打印 BQ 内部内容的预期输出?
声明
BlockingQueue<String> sharedResource = new ArrayBlockingQueue<String>(3);
制作人
Runnable r = new Runnable() {
public void run() {
for (int i = 1; i <= 2; i++) {
try {
String d = Thread.currentThread().getName() + "->" + i;
synchronized (sharedResource) {
sharedResource.put(d);
System.out.println("Produce : " + d);
}
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
消费者
Thread consumer = new Thread(new Runnable() {
public void run() {
while (true) {
try {
System.out.println("C : " + sharedResource.take());
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
输出
***P1->1
P3->1
P5->1
P2->1***
C : P1->1
C : P3->1
P4->1
C : P5->1
P2->2
P5->2
C : P2->1
P3->2
C : P4->1
P1->2
C : P2->2
P4->2
C : P5->2
C : P3->2
C : P1->2
C : P4->2
更新:我调用生产者和消费者如下。
Thread producer1 = new Thread(r);
Thread producer2 = new Thread(r);
Thread producer3 = new Thread(r);
Thread producer4 = new Thread(r);
Thread producer5 = new Thread(r);
producer1.setName("P1");
producer2.setName("P2");
producer3.setName("P3");
producer4.setName("P4");
producer5.setName("P5");
producer1.start();
producer2.start();
producer3.start();
producer4.start();
producer5.start();
consumer.start();