Различные типы потребителей и производителей, использующих один и тот же буфер - PullRequest
0 голосов
/ 12 мая 2019

У меня есть два типа производителей, которые производят два разных типа элементов, и два разных типа потребителей, поэтому производители типа 1 должны создавать элементы для типа 1 и т. Д.

Я пытался добавить больше условий в блокировки, создавая разные функции для каждого типа, но это не помогло

public class SharedBuffer {

    private ReentrantLock l= new ReentrantLock();
    private Condition producer = l.newCondition();
    private Condition consumer = l.newCondition();
    private Condition consumerType2 = l.newCondition();
    private Element buffer[];
    private int in, out, size;

    public Sharedbuffer(int size){
        buffer = new Element[size];
        for(int i=0; i<buffer.length;i++) {
            buffer[i]= null;
        }
        in=out=size=0;
    }

    public void deposit(Element new) throws InterruptedException{
        l.lock();
        try {
            while(size>=buffer.length)
                producer.await();
            buffer[in]=new;
            in = (in+1)%buffer.length;
            size++;
            if(new.getType()==1) {
                consumer.signal();
            }
            else {consumerType2.signal();}
        } finally {
            l.unlock();
        }
    }

    public Element extract() throws InterruptedException{
        l.lock();
        try {
            while(size<=0) {
                consumer.await();}
            Element new = buffer[out];
            out = (out+1)%buffer.length;
            size--;
            producer.signal();
            return new;         
        } finally {
            l.unlock();
        }
    }

    public Element extractType2() throws InterruptedException{
        l.lock();
        try {
            while(size<=0) {
                consumerType2.await();}
            Element new = buffer[out];
            out = (out+1)%buffer.length;
            size--;
            producer.signal();
            return new;         
        } finally {
            l.unlock();
        }
    }

Проблема в том, что потребители типа 1 иногда потребляют элементы типа 2 и наоборот.

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