【问题标题】:The problem of this code is in the output. Producer produce more than once. Why and how can I solve it?这段代码的问题在于输出。生产者生产不止一次。为什么以及如何解决它?
【发布时间】:2018-10-04 03:25:20
【问题描述】:

这段代码的问题在于输出。生产者生产不止一次。为什么以及如何解决它? 之后每个生产者都应该跟随一个消费者。 这段代码可以粘贴到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

但是之后每个生产者都应该跟随一个消费者。可以帮到我吗?

【问题讨论】:

标签: java multithreading buffer consumer producer


【解决方案1】:

这个问题很简单,虽然我看不明白,但看了两三遍后,我找到了。第一个问题是您必须使用equals() 来比较字符串。
您提出的第二个问题是,您仅检查大于 5 的“C2”数字和小于 6 的“C1”数字,如果您的“C2”大于或等于 6,则不打印任何内容(如果您小于或等于 5 且“C1”没有再次打印)(挑战我!!,我认为这是多线程问题)
还有其他错误。您将 while(true) 用于消费者并创建 2 个 cunsumer 来创建未完成的线程(如果需要,将它们设置为守护进程)并且更喜欢使用 join 而不是在您的 main 方法中等待。

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多