此代码的问题在输出中。生产者生产不止一次。为什么以及如何解决? 之后每个生产者都应该跟随一个消费者。 可以将这些代码粘贴到IDE中并直接运行。 我认为问题出在变量准备好了。我试图在不同的地方移动,但是没有用。请帮助我。
public class Application
{
public static void main(String[] args) {
Buffer b = new Buffer();
Consumer c1 = new Consumer(b, "C1");
Consumer c2 = new Consumer(b, "C2");
Producer p = new Producer(b);
c1.start();
c2.start();
p.start();
try
{
Thread.sleep(5000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
p.stop();
c1.stop();
c2.stop();
}
}
class Buffer
{
protected boolean ready = false;
private int num;
public synchronized void put(int x) {
while (ready)
{
try
{
wait();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
num = x;
ready = true;
notifyAll();
}
public synchronized int get() {
while (!ready)
{
try
{
wait();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
ready = false;
notifyAll();
return num;
}
}
class Producer extends Thread
{
private Buffer buffer;
private int h;
public Producer(Buffer b) {
buffer = b;
}
public void run() {
for (int i = 0; i < 10; i++)
{
synchronized (buffer)
{
h = (1 + (int) (Math.random() * 10));
buffer.put(h);
System.out.println("prodotto:" + h);
}
}
}
}
class Consumer extends Thread
{
private Buffer buffer;
private int x;
private String nome;
public Consumer(Buffer b, String s) {
buffer = b;
nome = s;
}
public void run() {
while (true)
{
synchronized (buffer)
{
x = buffer.get();
//C1 C2 prints numbers from 1 to 5
//C2 prints numbers from 6 to 10
if (this.nome == "C1" && x < 6)
{
System.out.println(nome + "- consuma:" + x);
}
if (this.nome == "C2" && x > 5)
{
System.out.println(nome + "- consuma:" + x);
}
}
}
}
}
输出>
produced:9
C2- consumed:9
produced:4
C1- consumed:4
produced:4
produced:9
produced:1
produced:9
C2- consumed:9
produced:10
produced:1
produced:3
但是在每个生产者之后都应该跟随一个消费者。可以帮我吗?
答案 0 :(得分:0)
这个问题非常容易,尽管我对快速外观不了解,经过2或3次外观后,我发现了。第一个问题是必须使用equals()
来比较字符串。
您遇到的第二个问题是,对于“ C2”,仅检查大于5的数字;对于“ C1”,仅检查小于6的数字;如果您的“ C2”大于或等于6,则不打印任何内容(如果小于或等于5并且“ C1”不再打印)(对我来说具有挑战性!,我认为这是多线程问题)
还有其他错误。您将while(true)
用于消费者,并创建2个cunsumer,该cunsumer创建未完成的线程(如果需要,将其设置为守护进程),并且更喜欢使用join
而不是在main
方法中等待。 / p>