Найти тему
DEBAGanov

Java 1098. Напишите простейший многопоточный ограниченный буфер с использованием synchronized.

Пример простейшего многопоточного ограниченного буфера с использованием 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