LinkedTransferQueue<E> — 링크드 노드 기반 무제한 TransferQueue

LinkedTransferQueue<E> — 링크드 노드 기반 무제한 TransferQueue

LinkedTransferQueue<E>는 링크드 노드 기반의 무제한(unbounded) TransferQueue 예요. 이 큐는 주어진 생산자에 대해 요소를 FIFO(선입선출) 순서로 정렬해요. 헤드는 일부 생산자에 대해 가장 오래 있었던 요소이고, 테일은 가장 짧게 있었던 요소예요.

출처: Java API Reference

본문

대부분의 컬렉션과 달리 size 메서드는 상수 시간 연산이 아니라는 점에 주의해야 해요. 이 큐들의 비동기적 특성 때문에 현재 요소 수를 알아내려면 요소를 순회해야 하고, 순회 중 컬렉션이 수정되면 부정확한 결과를 보고할 수 있어요.

addAll, removeIf, forEach 같은 여러 요소를 추가·제거·검사하는 벌크 연산은 원자적으로 수행된다는 보장이 없어요. 예를 들어 addAll과 동시에 forEach를 순회하면 추가된 요소의 일부만 관찰할 수 있어요.

이 클래스와 이터레이터는 CollectionIterator 인터페이스의 모든 선택적 메서드를 구현해요. 다른 동시 컬렉션과 마찬가지로, 한 스레드가 객체를 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() — 큐의 모든 요소를 제거해요. 내부적으로 pollnull을 반환할 때까지 반복 호출해요.

더 알아보기 (Learn more)