gpt4 book ai didi

Java 阻塞队列

转载 作者:行者123 更新时间:2023-11-29 05:22:48 25 4
gpt4 key购买 nike

<分区>

我将 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();

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