Я новичок в программировании и сделал только 1021 * в прошлом. Я работаю над университетским заданием по реализации проблемы Продюсер-Потребитель в Java с использованием концепции многопоточности. В этом случае есть два производителя и один потребитель. Производитель A производит предмет из расчета один раз в 5 минут (только пример), производитель B производит предмет из расчета один раз в 6 минут. Предметы размещаются на полке ограниченного размера, которая вмещает только 5 предметов.
Потребитель забирает товар с полки каждые 4 минуты. Потребитель не сможет работать, когда полка пуста, а производители не смогут работать, когда полка заполнена.
Программа должна продолжаться до тех пор, пока каждый производитель не произведет 10 единиц, а потребитель не израсходует 20 единиц. .
Это то, что я сделал до сих пор:
class Buffer{
private int v;
private volatile boolean empty = true;
public synchronized void insert(int x) {
while(!empty) {
try {
wait();
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
empty = false;
v = x;
notify();
}
public synchronized int remove() {
while(empty) {
try {
wait();
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
empty = true;
return v;
}
}
Над блоком кода указан класс для упомянутой полки.
Блок кода ниже является классом производителя. Я решил использовать массив вместо LinkedList, поскольку нам не разрешено использовать SynchronizedList для этого назначения.
class Producer extends Thread{
private int size;
private int[] queue;
private int queueSize;
public Producer(int[] queueln, int queueSizeln, String ThreadName) {
super(ThreadName);
this.queue = queueln;
this.queueSize = queueSizeln;
}
public void run() {
while(true) {
synchronized(queue) {
while(size == queueSize) {
System.out.println(Thread.currentThread().getName() + "Shelf is full: waiting...\n");
try {
queue.wait();
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
//when queue is empty, produce one, add and notify
int pot = 1;
System.out.println(Thread.currentThread().getName() + " producing...: " + pot);
}
}
}
}
Однако я столкнулся с проблемой. Поскольку Java не позволяет мне добавлять массив, я понятия не имею, как продолжить код. Первоначально я планировал добавить значение банка к:
int[] queue
, чтобы визуализировать производителя, производящего предмет и кладущего его на полку.
Буду очень признателен за вашу помощь!