gpt4 book ai didi

Java 线程 |生产者消费者 : What's wrong with the code?

转载 作者:行者123 更新时间:2023-12-02 02:39:13 25 4
gpt4 key购买 nike

尝试学习多线程和线程的进程间通信。已实现典型producer-consumer问题。然而,我得到的输出是相当连续的,在理想情况下使用线程时不应该出现这种情况。

好的,这是完整的代码:

public class ProducerConsumerSimulation {


public static ProducerConsumerSimulation simulation = new ProducerConsumerSimulation();


private Queue<Integer> sharedQueue = new LinkedList<Integer>();

private int MAX_LIMIT = 10;

public void produce(int i){
synchronized (sharedQueue) {
while(true){


while(sharedQueue.size()==MAX_LIMIT){
try {
sharedQueue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
sharedQueue.add(i);
System.out.println("Produced: "+i);
sharedQueue.notifyAll();
return;


}
}
}

public void consume() {
synchronized (sharedQueue) {
while (true) {


while (sharedQueue.isEmpty()) {
try {
sharedQueue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int i = sharedQueue.remove();
System.out.println("Consumed: " + i);
sharedQueue.notifyAll();
return;


}
}
}

/**
* @param args
*/
public static void main(String[] args) {


for(int i=1;i<=5;i++){

Runnable p = new Producer();
Thread prod = new Thread(p);
prod.start();
}
for(int i=1;i<=5;i++){

Runnable c = new Consumer();
Thread con = new Thread(c);
con.start();
}


}

}

生产者线程:

public class Producer implements Runnable {

/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {

for(int i=1;i<=10;i++){
ProducerConsumerSimulation.simulation.produce(i);
}

}

}

消费者线程:

public class Consumer implements Runnable {

/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {

for(int i=1;i<=10;i++){
ProducerConsumerSimulation.simulation.consume();
}

}

}

现在,当我运行程序时,生产者线程总是先于消费者线程运行。即使我创建多个生产者/消费者,结果也是相同的。以下是单个生产者和单个消费者的输出:

Produced: 1
Produced: 2
Produced: 3
Produced: 4
Produced: 5
Produced: 6
Produced: 7
Produced: 8
Produced: 9
Produced: 10
Consumed: 1
Consumed: 2
Consumed: 3
Consumed: 4
Consumed: 5
Consumed: 6
Consumed: 7
Consumed: 8
Consumed: 9
Consumed: 10

有人可以解释一下这里的行为吗?我在这里浏览了很多答案,但想了解我是否错误地实现了或者其他。

最佳答案

首先,您应该删除这两个 while (true) 循环,它们实际上只执行一次,因为您在第一次迭代后返回。它使您的代码非常困惑。

现在,关于您的问题:生产者和消费者都不会在两次生产/消费之间执行任何操作。他们立即重新进入同步块(synchronized block)以向队列中放入/获取某些内容。一个更实际的示例在将值放入队列之前需要一些时间来生成这些值,并且需要一些时间对从队列中获得的值进行某些操作。如果您在每次调用 Produce() 或 Consumer() 后引入任意延迟,您将开始看到更多的交错生产和消费。

最后,请注意,您正在通过使用 LinkedList、同步块(synchronized block)和调用 wait/notifyAll 来重新发明轮子。您应该只使用 BlockingQueue,这对您来说就足够了。

关于Java 线程 |生产者消费者 : What's wrong with the code?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45763968/

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