Java 两类同步
我有4个类:主类、生产者类、消费者类和缓冲区类。buffer类包含循环数组的实现(假设它可以工作)。生产者类添加到缓冲区数组,消费者类从缓冲区数组中删除。主类为生产者和消费者创建线程 在producer类中,如果缓冲区未满,则会添加到缓冲区中。如果已满,它将等待使用者从阵列中删除某些内容 在Consumer类中,如果缓冲区不是空的,它将从中删除一个项。如果为空,则等待生产者向缓冲区添加内容 我遇到的问题是,producer将向数组中添加项,但每次它通知消费者它已添加到缓冲区时,消费者都会保持等待状态。它永远不会继续执行代码的其余部分Java 两类同步,java,multithreading,synchronized,Java,Multithreading,Synchronized,我有4个类:主类、生产者类、消费者类和缓冲区类。buffer类包含循环数组的实现(假设它可以工作)。生产者类添加到缓冲区数组,消费者类从缓冲区数组中删除。主类为生产者和消费者创建线程 在producer类中,如果缓冲区未满,则会添加到缓冲区中。如果已满,它将等待使用者从阵列中删除某些内容 在Consumer类中,如果缓冲区不是空的,它将从中删除一个项。如果为空,则等待生产者向缓冲区添加内容 我遇到的问题是,producer将向数组中添加项,但每次它通知消费者它已添加到缓冲区时,消费者都会保持等待
// 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();
在producer中,有一个print语句,它打印添加到缓冲区中的5个值(缓冲区的最大大小),但之后什么也不会发生。生产者将值添加到数组中,然后进入等待状态,但消费者不做任何事情,因为它仍然处于等待状态
我不明白为什么消费者不继续,尽管生产者每次向缓冲区添加内容时都会执行notify。在您的代码中
已同步(这)
是毫无意义的,因为消费者
和生产者
都是独立的对象。这些对象中的每一个都有自己的此
监视器,其他对象无法访问该监视器。当(buffer.isEmpty())wait()时,您卡在上的消费者中代码>因为Producer
中没有调用cosumer.notify()
它很可能是synchronized(buffer)
(后面是buffer.wait()
和buffer.notify()
),因为它是表示代码中共享状态的buffer
对象
您正在使用缓冲区重新实现。为什么不使用JDK中已有的类?Thx。成功了!花了这么多时间想弄明白。
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;
}