Решение проблемы производитель-потребитель в Java с ограниченным буфером с использованием синхронизации потоков

Вот пример того, как можно решить проблему производитель-потребитель в Java, используя классическое решение с ограниченным буфером и синхронизацией потоков, используя wait()и notifyAll()методы:

import java.util.LinkedList;
class Buffer {
    private LinkedList<Integer> buffer;
    private int capacity;
    public Buffer(int capacity) {
        this.capacity = capacity;
        this.buffer = new LinkedList<>();
    }
    public synchronized void produce(int item) throws InterruptedException {
        while (buffer.size() == capacity) {
            wait();
        }
        buffer.add(item);
        System.out.println("Produced: " + item);
        notifyAll();
    }
    public synchronized int consume() throws InterruptedException {
        while (buffer.isEmpty()) {
            wait();
        }
        int item = buffer.removeFirst();
        System.out.println("Consumed: " + item);
        notifyAll();
        return item;
    }
}
class Producer implements Runnable {
    private Buffer buffer;
    public Producer(Buffer buffer) {
        this.buffer = buffer;
    }
    public void run() {
        try {
            for (int i = 1; i <= 10; i++) {
                buffer.produce(i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
class Consumer implements Runnable {
    private Buffer buffer;
    public Consumer(Buffer buffer) {
        this.buffer = buffer;
    }
    public void run() {
        try {
            for (int i = 1; i <= 10; i++) {
                buffer.consume();
                Thread.sleep(2000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
public class Main {
    public static void main(String[] args) {
        Buffer buffer = new Buffer(5);
        Thread producerThread = new Thread(new Producer(buffer));
        Thread consumerThread = new Thread(new Consumer(buffer));
        producerThread.start();
        consumerThread.start();
    }
}

Этот код демонстрирует простую реализацию проблемы производитель-потребитель с использованием буфера емкостью 5. Класс Bufferпредставляет собой общий буфер между производителем и потребителем. Метод produceиспользуется производителем для добавления элементов в буфер, а метод consumeиспользуется потребителем для удаления элементов из буфера.

Классы Producerи Consumerявляются потоками-производителями и потребителями соответственно. Они взаимодействуют с общим буфером, вызывая методы produceи consume. Метод mainсоздает экземпляр буфера и запускает потоки производителя и потребителя.