Проблема этого кода в выводе.Продюсера производят не раз.Почему и как я могу это решить? - PullRequest
0 голосов
/ 03 октября 2018

Проблема этого кода в выводе.Продюсера производят не раз.Почему и как я могу это решить?Ведь каждый производитель должен следовать за потребителем.Этот код можно вставить в 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

Но после каждого производителя следует следить за потребителем.Можно ли мне помочь?

1 Ответ

0 голосов
/ 03 октября 2018

проблема очень проста, хотя я не понял ее при быстром взгляде, и после 2 или 3 взгляда я ее нашел.Первая проблема заключается в том, что вы должны использовать equals() для сравнения строк.
Вторая проблема, которую вы сделали, заключается в том, что вы проверяете только для чисел больше 5 только для "C2" и меньше 6 только для "C1", и если у вас есть«C2» с большим или равным 6, ничего не напечатано (и если у вас меньше или равно 5 и «C1» ничего не напечатано снова) (Сложно для меня !!, я думаю, что это проблема многопоточности)
Есть и другие ошибки.Вы используете while(true) для потребителя и создаете 2 cunsumer, которые создают поток, который не завершается (установите их deamon, если хотите) и предпочитаете использовать join вместо ожидания в вашем main методе.

...