자바 차단 대기 열 실현 원리 및 인 스 턴 스 분석
차단 대기 열 은 일반 대기 열과 다르다.대기 열 이 비어 있 을 때 대기 열 에서 요 소 를 가 져 오 는 작업 이 막 히 거나 대기 열 이 가득 찼 을 때 대기 열 에 요 소 를 추가 하면 막 힙 니 다.빈 차단 대기 열 에서 원 소 를 가 져 오 려 는 스 레 드 가 막 힐 것 입 니 다.다른 스 레 드 가 빈 대기 열 에 새로운 요 소 를 삽입 할 때 까지.마찬가지 로 가득 찬 차단 대기 열 에 새 요 소 를 추가 하려 는 스 레 드 역시 막 힐 것 입 니 다.다른 스 레 드 가 대기 열 을 다시 비 울 때 까지 대기 열 에서 하나 이상 의 요 소 를 제거 하거나 대기 열 을 완전히 비 울 때 까지 다음 그림 은 차단 대기 열 을 통 해 합작 하 는 방법 을 보 여 줍 니 다.
스 레 드 1 은 차단 대기 열 에 요 소 를 추가 하고 스 레 드 2 는 차단 대기 열 에서 요 소 를 제거 합 니 다.
5.0 부터 JDK 는 자바 util.concurrent 패키지 에서 차단 대기 열의 공식 구현 을 제공 합 니 다.JDK 에는 차단 대열 의 공식 실현 이 포함 되 어 있 지만
대기 열의 실현 을 막다
차단 대기 열의 실현 은 상한 선 을 가 진 Semaphore 와 유사 합 니 다.
쓸데없는 말 을 많이 하지 않다.
package com.huojg.test;
import java.util.LinkedList;
import java.util.List;
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);
}
}
enqueue 와 dequeue 방법 내부 에 서 는 대기 열의 크기 가 상한(limit)이나 하한(0)일 때 만 notify All 방법 을 호출 한 다 는 것 을 알 아야 합 니 다.만약 에 대기 열의 크기 가 상한 선 과 같 지 않 고 하한 선 과 같 지 않 으 면 모든 스 레 드 가 enqueue 나 dequeue 방법 을 호출 할 때 막 히 지 않 고 정상적으로 대기 열 에 요 소 를 추가 하거나 제거 할 수 있 습 니 다.자바 에 서 는 Lock 과 Condition 에 대해 전통 적 인 synchronized 와 wait/notify 체제 에 대한 대체 로 이해 할 수 있 습 니 다.
wait/notify 에 제한 이 있 습 니 다.wait/notify 를 호출 하 는 스 레 드 는 대상 의 자 물 쇠 를 가 져 야 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.