차단 대기열 구현
쓸데없는 말은 작작 하고 코드에 바로 올라가라.
class MyBlockingQueue {
//
private static final int DEFAULT_CAPACITY = 128;
//
private E[] queue;
//
private int capacity;
//
private int size;
//
private int head;
//
private int tail;
//
private Lock lock = new ReentrantLock();
private Condition notFull = lock.newCondition();
private Condition notEmpty = lock.newCondition();
public MyBlockingQueue() {
this(DEFAULT_CAPACITY);
}
public MyBlockingQueue(int capacity) {
this.capacity = capacity;
queue = (E[]) new Object[capacity];
}
// , ,
public void put(E element) throws InterruptedException {
lock.lock();
try {
while (size >= capacity) {
notFull.await();
}
queue[tail] = element;
if (++tail == capacity) {
tail = 0;
}
++size;
notEmpty.signal();
} finally {
lock.unlock();
}
}
// , , ,
public E take() throws InterruptedException {
lock.lock();
try {
while (size == 0) {
notEmpty.await();
}
E value = queue[head];
queue[head] = null;
if (++head == capacity) {
head = 0;
}
--size;
notFull.signal();
return value;
} finally {
lock.unlock();
}
}
}
실현된 기능은 비교적 간단하고put()와take() 두 가지 방법만 실현했기 때문에 진정한 차단 대기열은 당연히 복잡하게 맞아야 한다. 그러나 이 두 가지 방법은 차단 대기열이 다른 대기열과 구별되는 두 가지 가장 핵심적인 방법이어야 한다...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 다중 스레드 공유 전역 변수의 우열1. 다중 스레드 공유 전역 변수 우선 함수에서 전역 변수를 수정한 상황을 회상해 봅시다. 하나의 함수에서 전역 변수를 수정할 때 글로벌을 사용하여 설명해야 하는지, 전역 변수의 실행 지향을 수정했는지 확인해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.