Java 동시 사용 노트(14)------- 대기열 차단
1. 약술
차단 큐(BlockingQueue)는 두 개의 추가 작업을 지원하는 큐입니다.이 두 가지 추가 작업은 막힌 삽입과 제거 방법을 지원합니다.막힌 대기열은 스레드 탱크와 함께 사용할 수 있습니다!
왜 막힌 대열이라고 하죠?
다음은 삽입 삭제의 네 가지 처리를 소개한다.
처리 방식
이상을 던지다
특수값 반환
막히다
시간 초과 종료
삽입
add(e)
offer(e)
put(e)
offer(e, time, unit)
제거
remove()
poll()
take()
poll(time, unit)
검사 방법
element()
peek()
사용할 수 없음
사용할 수 없음
IllegalStateException("Queuefull")
이상이 발생합니다.대기열이 비어 있을 때, 대기열에서 원소를 가져오면 NoSuchElementException
이상이 발생합니다.boolean
유형2. Java의 차단 대기열
2.1 Array BlockingQueue(FIFO, 경계 있음)
이것은 유계수조이다.기본적으로 공정한 접근 대기열을 보장하지 않습니다.
왜 공평한 방법을 쓰지 않는가!
공평성을 확보하기 위해서는 통상적으로 물동량을 낮출 수 있다.
2.2 Linked BlockingQueue(FIFO, 경계 있음)
LinkedBlockingQueue
는 체인 테이블로 이루어진 경계 막힘 대열이다.이 대기열의 기본 및 최대 길이는 Integer.MAX_VALUE
입니다.2.3 Priority BlockingQueue(우선 순위)
Priority BlockingQueue는 우선 순위를 지원하는 경계가 없는 차단 대기열입니다.사용자 정의 클래스 구현
compareTo()
방법으로 원소 정렬 규칙을 지정하거나 구조 파라미터Comparator
를 지정하여 원소를 정렬할 수 있습니다.주의해야 할 것은 같은 우선순위 요소의 순서를 보장할 수 없다는 것이다.
2.4 DelayQueue(경계 없음)
대기열 사용
PriorityQueue
을 사용합니다.대기열의 요소는 Delayed 인터페이스를 실현해야 합니다. 요소를 만들 때 대기열에서 현재 요소를 가져올 수 있는 시간을 지정할 수 있습니다.지연 기간이 만료된 경우에만 대기열에서 요소를 추출할 수 있습니다.장면 적용:
2.5 SynchronousQueue(FIFO)
SynchronousQueue
는 요소를 저장하지 않는 막힌 대기열이다.모든put작업은take작업을 기다려야 합니다. 그렇지 않으면 원소를 계속 추가할 수 없습니다.기본적으로 라인은 비공평한 정책으로 대기열에 접근합니다.개인적 이해:
이 막힌 대기열은Cached Thread Pool과 함께 사용하면 이 막힌 대기열을 배달원으로 볼 수 있습니다!주방의 요리를 소비자에게 보내다.처리량이 높다
2.6 LinkedBlockingDeque
LinkedBlockingDeque
는 체인 테이블 구조로 구성된 양방향 막힘 대열이다.3. 실현 원리
알림 모드를 사용하여 구현
여기
ArrayBlockingQueue
를 예로 들면 클라이맥스가 온다!!!!위 소스:/** Condition for waiting takes */
private final Condition notEmpty;
/** Condition for waiting puts */
private final Condition notFull;
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity <= 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
위의 코드를 보면 생산 소비 양식과 두 개의 대기 행렬의 양식이 뚜렷하지 않습니까!
추가, 삭제 작업에 대해 살펴보겠습니다.
public void put(E e) throws InterruptedException {
checkNotNull(e);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == items.length)
notFull.await();
enqueue(e);
// isEmpty
} finally {
lock.unlock();
}
}
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == 0)
notEmpty.await();
return dequeue();
// notFull
} finally {
lock.unlock();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 다중 스레드 공유 전역 변수의 우열1. 다중 스레드 공유 전역 변수 우선 함수에서 전역 변수를 수정한 상황을 회상해 봅시다. 하나의 함수에서 전역 변수를 수정할 때 글로벌을 사용하여 설명해야 하는지, 전역 변수의 실행 지향을 수정했는지 확인해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.