У меня есть два типа производителей, которые производят два разных типа элементов, и два разных типа потребителей, поэтому производители типа 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 и наоборот.