DelayQueue — 지연 요소의 블로킹 큐
DelayQueue — 지연 요소의 블로킹 큐
DelayQueue<E extends Delayed>는 Delayed 요소의 무경계 블로킹 큐로, 요소의 지연(delay)이 만료되면(expired) 일반적으로 제거 대상이 돼요. 예약된 시간이 지난 작업을 순서대로 꺼내는 데 유용해요.
본문
개념 이해하기
DelayQueue는 Delayed 요소의 무경계 블로킹 큐로, 요소의 지연이 만료되면 일반적으로 제거 대상이 돼요.
public class DelayQueue<E extends Delayed>
extends AbstractQueue<E>
implements BlockingQueue<E>
- 요소가 만료(expired)됐는지는
getDelay(TimeUnit.NANOSECONDS)가 0보다 작거나 같은 값을 반환하는지로 판단해요. - 큐의 머리(head) 는 만료 시각이 가장 이른 요소예요(과거든 미래든).
- 만료된 머리(expired head) 는 만료됐으면서 만료 시각이 가장 이른 요소이며, 존재하면 그것도 head예요.
BlockingQueue 규약과의 의도적 차이
이 클래스는 BlockingQueue 인터페이스를 구현하지만 의도적으로 일반 계약을 위반해, 다음 메서드는 만료되지 않은 요소를 무시하고 오직 만료된 head만 제거해요: poll(), poll(long,TimeUnit), take(), remove().
그 외 모든 메서드는 만료·미만료 요소를 모두 다뤄요. 예를 들어 size()는 모든 요소 수를 반환하고, peek()은 take()가 만료를 기다리며 블로킹할 때도 (null이 아닌) head를 반환할 수 있어요. null 요소는 허용하지 않아요.
생성자
public DelayQueue() — 처음에 빈 DelayQueue를 만들어요.
public DelayQueue(Collection<? extends E> c) — 주어진 Delayed 인스턴스 컬렉션의 요소를 담은 큐를 만들어요.
NullPointerException— 컬렉션이나 요소가null일 때
삽입 메서드
public boolean add(E e) — 요소를 삽입해요. NullPointerException.
public boolean offer(E e) — 요소를 삽입해요. 무경계라 항상 true. NullPointerException.
public void put(E e) — 요소를 삽입해요. 무경계라 블로킹하지 않아요. NullPointerException.
public boolean offer(E e, long timeout, TimeUnit unit) — 요소를 삽입해요. 무경계라 블로킹하지 않으며 timeout/unit은 무시돼요. 항상 true. NullPointerException.
제거 메서드 (만료 head만)
public E poll() — 만료된 head를 꺼내 제거하거나, 만료 요소가 없으면 null.
public E take() throws InterruptedException — 만료된 head를 꺼내 제거하며, 필요하면 만료 요소가 생길 때까지 기다려요.
InterruptedException
public E poll(long timeout, TimeUnit unit) throws InterruptedException — 만료된 head를 꺼내고, 필요하면 최대 timeout까지 기다려요. 시간이 지나면 null.
InterruptedException
public E remove() — 만료된 head를 꺼내 제거하거나, 만료 요소가 없으면 예외를 던져요.
NoSuchElementException— 만료된 요소가 없을 때
조회·기타
public E peek() — 제거하지 않고 head를 반환하거나, 비어 있으면 null. poll과 달리 만료 요소가 없어도 다음에 만료될 요소(있다면)를 반환해요.
public int size() — 모든 요소(만료·미만료) 수를 반환해요.
public boolean remove(Object o) — 만료 여부와 무관하게 요소 하나를 제거해요. 제거됐으면 true.
public int drainTo(Collection<? super E> c) — 모든 사용 가능한 요소를 제거해 주어진 컬렉션에 추가해요. UnsupportedOperationException, ClassCastException, NullPointerException, IllegalArgumentException.
public int drainTo(Collection<? super E> c, int maxElements) — 최대 maxElements개만큼 제거·추가해요.
public void clear() — 원자적으로 모든 요소를 제거해요. 미만료 요소를 기다리지 않고 그냥 버려요.
public int remainingCapacity() — DelayQueue는 용량 제한이 없으므로 항상 Integer.MAX_VALUE 를 반환해요.
public Object[] toArray() / public <T> T[] toArray(T[] a) — 순서 없는 요소 배열을 반환해요. 예: Delayed[] a = q.toArray(new Delayed[0]);
public Iterator<E> iterator() — 모든(만료·미만료) 요소에 대한 약하게 일관적인 iterator를 반환해요. 특정 순서를 보장하지 않아요.