Вот пример того, как можно решить проблему производитель-потребитель в 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
создает экземпляр буфера и запускает потоки производителя и потребителя.