gpt4 book ai didi

java - 两类同步

转载 作者:行者123 更新时间:2023-11-30 01:44:12 25 4
gpt4 key购买 nike

我有 4 个类:Main、Producer、Consumer 和 Buffer。缓冲区类包含循环数组的实现(假设它有效)。生产者类向缓冲区数组添加内容,而消费者类从缓冲区数组中删除内容。 Main 类为生产者和消费者创建一个线程。

在生产者类中,如果缓冲区未满,则会添加缓冲区。如果它已满,它将等待消费者从数组中删除某些内容。

在 Consumer 类中,如果缓冲区不为空,则会从中删除一个项目。如果它是空的,它将等待生产者向缓冲区添加一些内容。

我遇到的问题是生产者会将项目添加到数组中,但每次它通知消费者它已添加到缓冲区时,消费者都会处于等待状态。它永远不会继续执行其余代码。

// Main.java
Buffer buffer = new Buffer(5); // creates a circular array of length 5.

// 10 is total number of items to be added
Producer p = new Producer(buffer, 10); // uses random number generator for values
Consumer c = new Consumer(buffer, 10);

p.start();
c.start();

p.join();
c.join();
public class Producer extends Thread {

...

public void run() {
...
while(true) {
synchronized(this) {
try {
while(buffer.isFull()) wait();
...
buffer.insert(val);
notify();
... // other stuff that eventually breaks the loop
} catch(InterruptedException e) {}
}
}
}
}
public class Consumer extends Thread {

...

public void run() {
while(true) {
synchronized(this) {
try {
while(buffer.isEmpty()) wait(); // its stuck here
...
buffer.remove();
notify();
... // other stuff that eventually breaks the loop
} catch (InterruptedException e) {}
}
}
}
}

// Inside Buffer.java

public void insert(int n) {
...
buffer[front] = n;
front++;
size++;
}

public int remove() {
...
temp = buffer[rear] = -1;
rear--;
size--;
return temp;
}

在生产者中,有一个打印语句打印添加到缓冲区的 5 个值(缓冲区的最大大小),但此后什么也没有发生。 Producer 将值添加到数组中,然后进入等待状态,但 Consumer 不执行任何操作,因为它仍然处于等待状态。

我不明白为什么消费者不继续,尽管生产者每次向缓冲区添加内容时都会执行通知。

最佳答案

在您的代码中,synchronized(this) 是没有意义的,因为 ConsumerProducer 都是独立的对象。每个对象都有自己的 this 监视器,其他对象无法访问该监视器。您被困在 while(buffer.isEmpty()) wait(); 上的 Consumer 中,因为 Producer 中没有任何内容调用 cosumer.notify ().

很可能它应该是synchronized(buffer)(后面是buffer.wait()buffer.notify()),因为它是代表代码中共享状态的 buffer 对象。

您正在重新实现 java.util.concurrent.ArrayBlockingQueue与您的缓冲区。为什么不使用 JDK 中已有的类?

关于java - 两类同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58774943/

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