LinkedTransferQueue<E> — 링크드 노드 기반 무제한 TransferQueue
LinkedTransferQueue<E> — 링크드 노드 기반 무제한 TransferQueue
LinkedTransferQueue<E>는 링크드 노드 기반의 무제한(unbounded) TransferQueue 예요. 이 큐는 주어진 생산자에 대해 요소를 FIFO(선입선출) 순서로 정렬해요. 헤드는 일부 생산자에 대해 가장 오래 있었던 요소이고, 테일은 가장 짧게 있었던 요소예요.
본문
대부분의 컬렉션과 달리 size 메서드는 상수 시간 연산이 아니라는 점에 주의해야 해요. 이 큐들의 비동기적 특성 때문에 현재 요소 수를 알아내려면 요소를 순회해야 하고, 순회 중 컬렉션이 수정되면 부정확한 결과를 보고할 수 있어요.
addAll, removeIf, forEach 같은 여러 요소를 추가·제거·검사하는 벌크 연산은 원자적으로 수행된다는 보장이 없어요. 예를 들어 addAll과 동시에 forEach를 순회하면 추가된 요소의 일부만 관찰할 수 있어요.
이 클래스와 이터레이터는 Collection과 Iterator 인터페이스의 모든 선택적 메서드를 구현해요. 다른 동시 컬렉션과 마찬가지로, 한 스레드가 객체를 LinkedTransferQueue에 넣기 전의 동작은 다른 스레드가 그 요소를 접근하거나 제거한 후의 동작보다 happen-before 관계예요.
생성자
LinkedTransferQueue() — 처음에 빈 LinkedTransferQueue를 만들어요.
LinkedTransferQueue(Collection<? extends E> c) — 주어진 컬렉션의 요소를 이터레이터 순회 순서로 담은 LinkedTransferQueue를 만들어요. 컬렉션이나 요소가 null이면 NullPointerException을 던져요.
전송(Transfer) 메서드
boolean tryTransfer(E e) — 가능하면 요소를 즉시 기다리는 소비자에게 전송해요. 이미 소비자가 (take()나 시간 제한 poll에서) 기다리고 있으면 즉시 전송하고, 아니면 요소를 인큐하지 않고 false를 반환해요.
void transfer(E e) throws InterruptedException — 요소를 소비자에게 전송하고, 필요하면 기다려요. 기다리는 소비자가 이미 있으면 즉시 전송하고, 아니면 요소를 테일에서 인큐한 뒤 소비자가 받을 때까지 기다려요. 기다리는 동안 인터럽트되면 요소가 인큐된 채로 남지 않고 InterruptedException을 던져요.
boolean tryTransfer(E e, long timeout, TimeUnit unit) — 시간 제한이 지나기 전에 요소를 소비자에게 전송해요. 지정 시간이 지나면 false를 반환하고 요소는 인큐되지 않아요.
boolean hasWaitingConsumer() — take()나 시간 제한 poll로 요소를 받을 준비가 된 소비자가 최소 하나 있으면 true를 반환해요. 순간적인 상태를 나타내요.
int getWaitingConsumerCount() — 요소를 기다리는 소비자 수의 추정치를 반환해요. 모니터링이나 휴리스틱에는 유용하지만 동기화 제어에는 쓰지 말아요.
큐 메서드
void put(E e) — 요소를 테일에서 삽입해요. 큐가 무제한이라 절대 블로킹하지 않아요.
boolean offer(E e, long timeout, TimeUnit unit) — 요소를 테일에서 삽입해요. 무제한이라 절대 블로킹하거나 false를 반환하지 않아요.
boolean offer(E e) / boolean add(E e) — 요소를 테일에서 삽입해요. 무제한이라 false를 반환하거나 IllegalStateException을 던지지 않아요.
E take() throws InterruptedException — 헤드를 가져와 제거하고, 필요하면 요소가 생길 때까지 기다려요.
E poll(long timeout, TimeUnit unit) — 헤드를 가져와 제거하고, 필요하면 최대 지정 시간까지 기다려요.
E poll() — 헤드를 가져와 제거하거나 비어 있으면 null을 반환해요.
E peek() — 헤드를 가져오되 제거하지 않아요.
boolean isEmpty() — 큐에 요소가 없으면 true를 반환해요.
int size() — 큐의 요소 수를 반환해요. Integer.MAX_VALUE보다 많으면 Integer.MAX_VALUE를 반환해요. 상수 시간 연산이 아니고 O(n) 순회가 필요해요.
int remainingCapacity() — LinkedTransferQueue는 용량 제한이 없으므로 항상 Integer.MAX_VALUE를 반환해요.
int drainTo(Collection<? super E> c) — 사용 가능한 모든 요소를 제거해 주어진 컬렉션에 추가해요.
int drainTo(Collection<? super E> c, int maxElements) — 최대 지정 개수만큼 요소를 옮겨요.
boolean remove(Object o) — 지정 요소의 단일 인스턴스를 제거해요.
boolean contains(Object o) — 지정 요소를 포함하면 true를 반환해요.
Object[] toArray() / <T> T[] toArray(T[] a) — 큐의 모든 요소를 담은 배열을 반환해요.
Spliterator<E> spliterator() — CONCURRENT, ORDERED, NONNULL을 보고하는 약하게 일관된 Spliterator를 반환해요.
Iterator<E> iterator() — 순서대로 순회하는 약하게 일관된 이터레이터를 반환해요.
void clear() — 큐의 모든 요소를 제거해요. 내부적으로 poll이 null을 반환할 때까지 반복 호출해요.
더 알아보기 (Learn more)
- TransferQueue 인터페이스 — 전송 메서드의 계약
- BlockingQueue 인터페이스 — 블로킹 큐 기본 연산
- Java 공식 API