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, а производитель не продолжает производить?