Пример простейшего многопоточного ограниченного буфера с использованием synchronized:
import java.util.LinkedList;
import java.util.Queue;
public class BoundedBuffer<T> {
private int capacity;
private Queue<T> buffer;
public BoundedBuffer(int capacity) {
this.capacity = capacity;
this.buffer = new LinkedList<>();
}
public synchronized void put(T element) throws InterruptedException {
while (buffer.size() == capacity) {
wait();
}
buffer.offer(element);
notifyAll();
}
public synchronized T take() throws InterruptedException {
while (buffer.isEmpty()) {
wait();
}
T element = buffer.poll();
notifyAll();
return element;
}
}
В этой реализации используются ключевое слово synchronized и методы wait() и notifyAll() для обеспечения синхронизации и взаимодействия между потоками.
Метод put(T element) добавляет элемент в буфер. Если буфер заполнен, вызывающий поток блокируется с помощью wait(), пока не появится место в буфере. Когда элемент успешно добавлен, другие потоки, которые могут ждать освобождения буфера, будут разблокированы с помощью notifyAll().
Метод take() извлекает элемент из буфера. Если буфер пуст, вызывающий поток блокируется с помощью wait(), пока в буфере не появится элемент. Когда элемент успешно извлечен, другие потоки, которые могут ждать добавления элемента в буфер, будут разблокированы с помощью notifyAll().
Обратите внимание, что методы put() и take() объявляют ожидаемое исключение InterruptedException, поскольку операции блокировки (через wait()) могут быть прерваны другими потоками. Это позволяет обработать прерывание правильным образом или пробросить его выше для дальнейшей обработки.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov