무한 큐에 요소 추가 모든 작업이 차단되지 않습니다(스레드도 마찬가지). -안전함) 매우 큰 용량으로 확장될 수 있습니다. 무한 차단 대기열 사용 BlockingQueue 생산자-소비자 모델을 설계할 때 가장 중요한 점은 생산자가 대기열에 메시지를 추가하는 만큼 빠르게 소비자가 메시지를 소비할 수 있어야 한다는 것입니다. 그렇지 않으면 메모리가 부족하여 OutOfMemory 예외가 발생할 수 있습니다.
데이터 구조
1. 일반적으로 연결 목록 또는 배열을 사용하여 구현됩니다.
2 일반적으로 FIFO(선입선출) 특성을 가지며 이중 종료 대기열로 설계될 수도 있습니다
3. 큐의 주요 작업 : Entering and dequeuing
Blocking Queue BlockingQueue
정의: 스레드 통신에서는 동시성이 아무리 높아도 언제든지 단일 JVM에서는 하나의 스레드만 항상 대기열 또는 대기열 제거 작업과 동시에 대기열에 들어갈 수 있습니다. BlockingQueue는 명시적인 동기화 없이 스레드 간에 공유될 수 있습니다. 차단 대기열 유형:
Wait
공통 차단 대기열
ArrayBlockingQueue:
배열에서 지원하는 경계 대기열
응용 프로그램 시나리오가 많습니다. 및 스레드 풀의 생산자-소비자 모델
작동 원리:
스레드 안전을 보장하기 위해 ReentrantLock을 기반으로 하며 조건
LinkedBlockingQueue:
무제한 대기열에 따라 대기열이 가득 찼을 때 차단을 구현합니다. 연결된 목록 기반(이론적으로 제한됨)
Priority BlockingQueue:
우선순위 힙에서 지원되는 무제한 우선순위 대기열
DelayQueue:
우선순위 힙에서 지원되는 시간 기반 스케줄링 대기열, 제한되지 않은 대기열을 기반으로 내부적으로 구현됨 PriorityQueue 및 배열 확장 구현을 기반으로 하는 무제한 대기열
Usage:
대기열에 추가된 개체는 Delayed 인터페이스를 구현해야 하며 Delayed는 Comparable 인터페이스에서 통합됩니다.
응용 시나리오:
영화 티켓 판매
작동 원리:
대기열은 시간에 따라 내부적으로 처리됩니다. 우선 순위에 따라 정렬됩니다. 클래스 스레드 풀 주기 실행을 지연합니다.
모두 put() 및 take()
와 같은 메서드를 사용하여 BlockingQueue 인터페이스를 구현합니다. 생성 방법은 다음과 같습니다.
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<> (666);
로그인 후 복사
BlockingQueue API
요소 추가:
method
의미
add()
삽입에 성공하면 true를 반환하고, 그렇지 않으면 IllegalStateException 예외가 발생합니다.
put()
큐에 지정된 요소를 삽입합니다. 가득 차면 삽입할 공간이 있을 때까지 차단됩니다
offer()
삽입에 성공하면 true를 반환하고, 그렇지 않으면 false를 반환합니다
offer(E e, 긴 시간 초과, TimeUnit 단위)
다음을 시도해 보세요. 대기열에 요소를 삽입하면 공간 삽입이 있을 때까지 차단되며 차단에는 시간 제어가 있습니다
검색 요소:
방법
의미
take( )
큐의 헤드 요소를 가져와서 큐가 비어 있으면 삭제합니다. 그런 다음 해당 요소가 사용 가능해질 때까지 차단하고 기다립니다.
poll(긴 시간 제한, TimeUnit 단위)
큐의 헤드를 검색하고 제거합니다. 큐, 필요한 경우 요소를 사용할 수 있을 때까지 지정된 대기 시간을 기다리고 시간이 초과되면 null