LinkedBlockingQueue<E> — 링크드 노드 기반 선택적 제한 블로킹 큐
LinkedBlockingQueue<E> — 링크드 노드 기반 선택적 제한 블로킹 큐
LinkedBlockingQueue<E>는 링크드 노드 기반의, 선택적으로 크기를 제한할 수 있는 블로킹 큐예요. 요소를 FIFO(선입선출) 순서로 정렬해요. 큐의 헤드는 큐에 가장 오래 있었던 요소이고, 테일은 가장 짧게 있었던 요소예요. 새 요소는 테일에 삽입되고, 검색 연산은 헤드에서 요소를 가져와요.
본문
링크드 큐는 일반적으로 배열 기반 큐보다 처리량이 높지만, 대부분의 동시 애플리케이션에서 성능 예측이 덜 일정해요. 선택적인 용량 제한 생성자 인자는 과도한 큐 확장을 막는 방법이 돼요. 용량을 지정하지 않으면 Integer.MAX_VALUE와 같아요. 링크드 노드는 삽입할 때마다 동적으로 생성되는데, 단 큐가 용량을 초과하게 만들지 않는 경우에만 그래요.
이 클래스와 그 이터레이터는 Collection과 Iterator 인터페이스의 모든 선택적 메서드를 구현해요. Java Collections Framework의 멤버예요.
생성자
LinkedBlockingQueue() — Integer.MAX_VALUE의 용량을 가진 LinkedBlockingQueue를 만들어요.
LinkedBlockingQueue(int capacity) — 주어진 (고정된) 용량을 가진 LinkedBlockingQueue를 만들어요. capacity가 0보다 크지 않으면 IllegalArgumentException을 던져요.
LinkedBlockingQueue(Collection<? extends E> c) — 컬렉션의 이터레이터 순회 순서로 요소가 담긴, Integer.MAX_VALUE 용량의 LinkedBlockingQueue를 만들어요. 컬렉션이나 요소가 null이면 NullPointerException을 던져요.
주요 메서드
int size() — 큐에 있는 요소 수를 반환해요.
int remainingCapacity() — 이 큐가 (메모리나 리소스 제약이 없을 때) 블로킹 없이 이상적으로 받아들일 수 있는 추가 요소 수를 반환해요. 항상 초기 용량에서 현재 size를 뺀 값과 같아요. 다른 스레드가 곧 요소를 삽입하거나 제거할 수 있으므로 remainingCapacity만으로 삽입 성공 여부를 알 수는 없어요.
void put(E e) throws InterruptedException — 요소를 큐의 테일에서 삽입하고, 필요하면 공간이 생길 때까지 기다려요. 기다리는 동안 인터럽트되면 InterruptedException, 요소가 null이면 NullPointerException을 던져요.
boolean offer(E e, long timeout, TimeUnit unit) — 요소를 테일에서 삽입하고, 공간이 생길 때까지 최대 지정 시간만큼 기다려요. 성공하면 true, 지정 시간이 지나도 공간이 없으면 false를 반환해요.
boolean offer(E e) — 큐 용량을 초과하지 않고 바로 삽입할 수 있으면 테일에서 삽입하고 true를, 큐가 가득 찼으면 false를 반환해요. 용량 제한 큐에서는 일반적으로 예외만 던지는 add보다 이 메서드가 더 선호돼요.
E take() throws InterruptedException — 큐 헤드를 가져와 제거하고, 필요하면 요소가 생길 때까지 기다려요.
E poll(long timeout, TimeUnit unit) — 큐 헤드를 가져와 제거하고, 필요하면 최대 지정 시간만큼 요소를 기다려요. 시간이 지나면 null을 반환해요.
E poll() — 큐 헤드를 가져와 제거하거나, 큐가 비어 있으면 null을 반환해요.
E peek() — 큐 헤드를 가져오되 제거하지 않아요. 비어 있으면 null을 반환해요.
boolean remove(Object o) — 큐에서 지정 요소의 단일 인스턴스를 제거해요. o.equals(e)인 요소 e를 제거하고, 큐가 변경됐으면 true를 반환해요.
boolean contains(Object o) — 큐가 지정 요소를 포함하면 true를 반환해요.
Object[] toArray() / <T> T[] toArray(T[] a) — 큐의 모든 요소를 순서대로 담은 배열을 반환해요. 반환 배열은 큐가 참조를 유지하지 않으므로 호출자가 자유롭게 수정할 수 있어요. 제네릭 버전은 런타임 타입을 지정할 수 있고, String[] y = x.toArray(new String[0]);처럼 쓰면 돼요.
void clear() — 큐에서 모든 요소를 원자적으로 제거해요.
int drainTo(Collection<? super E> c) — 사용 가능한 모든 요소를 큐에서 제거해 주어진 컬렉션에 추가해요. 반복적인 poll보다 효율적일 수 있어요. 자기 자신에게 drain하면 IllegalArgumentException이 발생해요.
int drainTo(Collection<? super E> c, int maxElements) — 최대 지정 개수만큼 요소를 옮겨요.
Iterator<E> iterator() — 큐 요소를 순서대로(헤드에서 테일로) 순회하는 약하게 일관된(weakly consistent) 이터레이터를 반환해요.
Spliterator<E> spliterator() — 큐의 요소에 대한 Spliterator를 반환해요. CONCURRENT, ORDERED, NONNULL을 보고하며, 제한된 병렬 처리를 위해 trySplit을 구현해요.
표준 Collection 메서드
forEach(Consumer), removeIf(Predicate), removeAll(Collection), retainAll(Collection) — Collection/Iterable 인터페이스의 표준 구현을 상속받아요.
더 알아보기 (Learn more)
- BlockingQueue 인터페이스 — 이 큐가 구현하는 블로킹 큐 계약
- Queue 인터페이스 — 큐 기본 연산
- Java 공식 API