public class BlockingQueue {
private List queue = new LinkedList();
private int limit = 10;
public BlockingQueue(int limit){
this.limit = limit;
}
public synchronized void enqueue(Object item)
throws InterruptedException {
while(this.queue.size() == this.limit) {
wait();
}
if(this.queue.size() == 0) {
notifyAll();
}
this.queue.add(item);
}
public synchronized Object dequeue()
throws InterruptedException{
while(this.queue.size() == 0){
wait();
}
if(this.queue.size() == this.limit){
notifyAll();
}
return this.queue.remove(0);
}
}
나의 이해는 이것이다 그것을 이해하려고 노력 온라인이 경계 큐 코드를 통과했다 : 더 이상 항목이없는 경우
- 대기열에서 아무 것도 대기열에서 제외 할 수 없으므로 wait()를 호출합니다.
- 대기열에 항목 수가 최대 인 경우 대기열을 지정할 수 없으므로 wait()를 호출합니다.
- 공간이 있으면 (큐의 일부 요소) 우리는 또한 디큐
- 뿐만 아니라 대기열 호출 할 수 있습니다 우리의 notifyAll() 그래서()의 모든 생산자와 소비자는
깨워 그러나 우리가 대기를 호출 요청에 일어나는 것을 . 그들은 notifyAll() 호출에서만 통지를 받습니까? 대기열에 공간이 생기 자마자 통지를받지 못하는 이유는 무엇입니까?
단지 notifyAll()을 볼 수 있지만 알리지는 않습니다. 어떻게 통지를 받습니까? –
'notifyAll'은 무엇이라고 생각하십니까? –
notifyAll()은 요소가 더 이상 없을 때만 enqueue에서 호출되고 max 요소가있을 때 dequeue에서 호출됩니다. 내 질문은 바로 그 것이다. 왜 이러한 제한을 기다리는 중입니까? 가능한 한 빨리 알려주지 않는 이유는 무엇입니까? –