Classi c проблема производителя и потребителя в java, которая не ведет обратный отсчет времени, как это должно быть - PullRequest
0 голосов
/ 07 апреля 2020
import java.util.Random;

public class BufferExample {
    public static void main (String[] args) throws Exception {

        Buffer buffer = new Buffer (10);
        MyProducer prod = new MyProducer(buffer);
        prod.start();
        MyConsumer cons = new MyConsumer(buffer);
        cons.start();
        System.out.println("Starting");
    }
}

class MyProducer extends Thread {
    private Buffer buffer;

    public MyProducer (Buffer buffer) {
        this.buffer = buffer;
    }

    public void run () {
        Random random = new Random();
        try {
            Thread.sleep(random.nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        buffer.addItem(new Object());
    }
}

class MyConsumer extends Thread {
    private Buffer buffer;

    public MyConsumer (Buffer buffer) {
        this.buffer = buffer;
    }

    public void run () {
        Random random = new Random();
        try {
            Thread.sleep(random.nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        buffer.removeItem();
    }
}

class Buffer {
    public int SIZE;    
    private Object[] objects;
    private int count = 0;

    public Buffer (int size) {
        SIZE = size;
        objects = new Object[SIZE];
    }

    public void addItem (Object object) {

        synchronized(this){
            while(count == SIZE){
                try{
                    wait();
                }
                catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
            objects[count] = object;
            count++;
            System.out.println(count);
            this.notifyAll();
        }

    }

    public Object removeItem() {
        synchronized(this){
            while(count == 0){
                try{
                    wait();
                }
                catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
            count--;
            System.out.println(count);
            this.notifyAll();
            return objects[count];
        }


    }
}

Мне разрешено изменять только класс Buffer, чтобы он был потокобезопасным. Я пытался синхронизировать (это) и ждать, но я до сих пор не понимаю, где именно разместить notifyALL. Хотя код не l oop навсегда, он печатает только 1,0 и затем завершается. Я почти уверен, что нахожусь на неправильном пути, но не уверен, где именно ошибка.

Я представляю, что если мое решение верное, поток производителя должен производить даже после первого потребления, что снизит счет до 0, но сейчас это не так.

Итак, мой вопрос: почему программа останавливается после 1,0, а производитель не продолжает производить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...