gpt4 book ai didi

java - 生产者消费者使用等待和通知: Consumer does not receive messages

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

我已经使用Java中的等待和通知机制准备了一个生产者消费者。下面是代码:

class Producer implements Runnable {

private int i = 0;
private ArrayList<Integer> arrayList;
private static final int MAX_SIZE = 5;

public Producer(ArrayList<Integer> arrayList) {
this.arrayList = arrayList;
}

@Override
public void run() {

while(true) {
try {
produce(i++);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

private synchronized void produce(int i) throws InterruptedException {

while(arrayList.size() == MAX_SIZE) {

System.out.println("The Queue is Full. Producer thread needs to wait.");

wait();
}
arrayList.add(i);
System.out.println("Added Element: "+i);
notifyAll();
Thread.sleep(3000);
}
}

class Consumer implements Runnable {

private ArrayList<Integer> arrayList;

public Consumer(ArrayList<Integer> arrayList) {
this.arrayList = arrayList;
}

@Override
public void run() {

while(true) {
try {
consume();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

private synchronized void consume() throws InterruptedException {

while(arrayList.isEmpty()) {

System.out.println("The Queue is empty. Consumer thread needs to wait.");

wait();
}
int data = arrayList.remove(0);
System.out.println("Removed Element: "+data);
notifyAll();
Thread.sleep(3000);
}
}

public class ProducerConsumerExample {

public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
Thread producer = new Thread(new Producer(arrayList), "Producer Thread");
Thread consumer = new Thread(new Consumer(arrayList), "Consumer Thread");
producer.start();
consumer.start();
}
}

下面是示例输出

The Queue is empty. Consumer thread needs to wait.
Added Element: 0
Added Element: 1
Added Element: 2
Added Element: 3
Added Element: 4
The Queue is Full. Producer thread needs to wait.

问题是消费者线程要么没有收到通知,要么通知丢失。我尝试理解代码,但没有得到任何关于我哪里出错的线索。

最佳答案

The issue is that the consumer thread is either not getting the notification or the notification is getting lost

发生这种情况的原因是生产者消费者没有在同一个实例上同步。它们在自己的实例(即 this)上独立同步。要解决此问题,ProducerConsumer 都可以在 ArrayList 或另一个实例上进行同步>共享对象。

关于java - 生产者消费者使用等待和通知: Consumer does not receive messages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59598173/

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