1. 소개

 
이 사용방법(예제)에서는 Java의

대기열

인터페이스에 대해 설명합니다.먼저 Queue 가 하는 일과 그  핵심 메소드를

살펴 

보겠습니다 . 다음 으로 Java가 표준으로 제공 하는 여러 구현에 대해 알아보겠습니다 .마지막으로 모든 것을 마무리하기 전에 스레드 안전성에 대해 이야기하겠습니다.

2. Queue 시각화

 
빠른 비유로 시작하겠습니다.우리가 첫 번째 사업인 핫도그 가판대를 막 개업했다고 상상해 보십시오. 우리는 소규모 비즈니스를 위해 가능한 가장 효율적인 방법으로 새로운 잠재 고객에게 서비스를 제공하고자 합니다. 한번에 한. 먼저, 우리는 새로운 고객이 뒤쪽에 합류하면서 우리 스탠드 앞에서 질서 정연하게 줄을 서도록 요청합니다. 조직력 덕분에 이제 우리는 맛있는 핫도그를 공정하게 배포할 수 있습니다.

Java의 큐 

도 비슷한 방식으로 작동합니다.

Queue 

를 선언한 후 새 요소를 뒤쪽에 추가하고 앞쪽에서 제거할 수 있습니다.사실, 우리가 자바에서 접하게 될

대부분의  큐 

는 선입선출 방식(흔히 FIFO로 축약됨)으로 작동합니다.그러나 

나중에 다룰

한 가지 예외가 있습니다.

3. 핵심 방법

 

Queue 

모든 구현 클래스에서 코딩해야 하는

여러 메서드

를 선언합니다 . 이제

더 중요한 몇 가지를 요약해 보겠습니다 .

  1. offer() – 대기열 에 새 요소를 삽입합니다.
  2. poll()  – 대기열 의 앞쪽에서 요소를 제거합니다. 
  3. peek()큐   의 맨 앞에 있는 요소를 제거하지 않고

4. 추상 큐

 

AbstractQueue 

Java가 제공하는 가장 간단한 가능한  Queue  구현입니다.

여기에는 offer

를 제외한 일부 Queue 

인터페이스 메서드의 골격 구현이 포함됩니다 .

AbstractQueue

 클래스

 

확장  하는 사용자 지정 대기열을 만들 때 null 요소의 삽입을 허용 하지  않는 제안 메서드

의 구현 을  제공해야 합니다.

또한 peek, poll, sizejava.util 의  iterator

메소드를 제공해야  합니다 .

AbstractQueue 를 사용하여  간단한  Queue  구현 을 구성해 보겠습니다.먼저,  Queue의  요소 를 저장하기 위해 

LinkedList  를 사용하여 클래스를 정의해 보겠습니다.

public class CustomBaeldungQueue<T> extends AbstractQueue<T> {

    private LinkedList<T> elements;

    public CustomBaeldungQueue() {
      this.elements = new LinkedList<T>();
    }

}
다음으로

필요한 메서드를 재정의하고 코드를 제공하겠습니다.

@Override
public Iterator<T> iterator() {
    return elements.iterator();
}

@Override
public int size() {
    return elements.size();
}

@Override
public boolean offer(T t) {
    if(t == null) return false;
    elements.add(t);
    return true;
}

@Override
public T poll() {
    Iterator<T> iter = elements.iterator();
    T t = iter.next();
    if(t != null){
        iter.remove();
        return t;
    }
    return null;
}

@Override
public T peek() {
    return elements.getFirst();
}
훌륭합니다. 빠른 단위 테스트로 작동하는지 확인하겠습니다.
customQueue.add(7);
customQueue.add(5);

int first = customQueue.poll();
int second = customQueue.poll();

assertEquals(7, first);
assertEquals(5, second);

4. 하위 인터페이스

 
일반적으로 

Queue  인터페이스는

3개의 주요 하위

인터페이스로 상속됩니다 .

차단 대기열, 전송 대기열

Deques

.함께, 이 3개의 인터페이스는 Java의 사용 가능한 대부분의 

대기열에 의해 구현됩니다.

 이러한 인터페이스가 무엇을 하도록 설정되었는지 간단히 살펴보겠습니다.

4.1. 대기열 차단

 

BlockingQueue 

인터페이스 는 

스레드가 

현재 상태에 따라

대기열 에서 대기하도록 하는 추가 작업을 지원합니다.  

스레드는 검색을 시도할 때 큐  가 비어 있지 않을

때까지 기다리 

거나 새 요소를 추가할 때 비어 있을 때까지 기다릴 수 있습니다.표준 

차단 대기열

에는 

LinkedBlockingQueue, SynchronousQueue 

및 

ArrayBlockingQueue

가 포함 됩니다.자세한 내용은 

대기열 차단

에 대한 기사를 참조하십시오 .

4.2. 전송 대기열

 

TransferQueue 

인터페이스는  BlockingQueue

인터페이스 

를 확장 하지만

생산자-소비자 패턴에 맞게 조정됩니다. 생산자에서 소비자로의 정보 흐름을 제어하여 시스템에 역압을 생성합니다.

Java는 

TransferQueue 

인터페이스  의 한 구현인

LinkedTransferQueue 와 함께 제공됩니다 .

4.3. 데크

 

Deque

 는 Double -

Ended

Queue 의 약자 이며 카드 한 벌과 유사합니다. 요소는 Deque의 시작과 끝 모두에서 가져올있습니다 . 전통적인  Queue와 마찬가지로  Deque  는 상단과 하단 모두에 있는 요소를 추가, 검색 및 엿보기 위한 메서드를 제공합니다 .

Deque 

작동  방식에 대한 자세한 사용방법(예제)는 

ArrayDeque  기사

를 확인하세요 .

5. 우선 순위 대기열

 

Java에서 접하는 대부분의 큐 

가 FIFO 원칙을 따른다 는 것을 앞서 보았습니다  .이 규칙에 대한 한 가지 예외는 

PriorityQueue

입니다. 새 요소가 우선 순위 대기열

에 삽입되면  자연 순서에 따라 또는

우선 순위 대기열

 을 구성할 때 제공되는  정의된 비교기 에 따라 정렬됩니다 .간단한 단위 테스트로 이것이 어떻게 작동하는지 살펴보겠습니다.
PriorityQueue<Integer> integerQueue = new PriorityQueue<>();

integerQueue.add(9);
integerQueue.add(2);
integerQueue.add(4);

int first = integerQueue.poll();
int second = integerQueue.poll();
int third = integerQueue.poll();

assertEquals(2, first);
assertEquals(4, second);
assertEquals(9, third);
정수가

Priority Queue 에 추가된 순서에도 불구하고

검색 순서가 숫자의 자연스러운 순서에 따라 변경 되었음을 알 수 있습니다 .

Strings

에 적용될 때도 마찬가지임을 알 수 있습니다  .
PriorityQueue<String> stringQueue = new PriorityQueue<>();

stringQueue.add("blueberry");
stringQueue.add("apple");
stringQueue.add("cherry");

String first = stringQueue.poll();
String second = stringQueue.poll();
String third = stringQueue.poll();

assertEquals("apple", first);
assertEquals("blueberry", second);
assertEquals("cherry", third);

6. 스레드 안전성

 

대기열

에 항목을 추가하는 것은 다중 스레드 환경에서 특히 유용합니다.

큐 

는  스레드 간에 공유될 수 있으며 공간이 확보될 때까지 진행을 차단하는 데 사용되어 일반적인 다중 스레드 문제를 극복하는 데 도움 이 됩니다.
예를 들어, 여러 스레드에서 단일 디스크에 쓰기 작업을 수행하면 리소스 경합이 발생하고 쓰기 시간이 느려질 수 있습니다. BlockingQueue 

를 사용하여 단일 작성기 스레드를 생성하면  이 문제를 완화하고 쓰기 속도를 크게 향상시킬 수 있습니다.

운 좋게도 Java 는 스레드로부터 안전하고 다중 스레드 프로그램에 완벽한

ConcurrentLinkedQueue, ArrayBlockingQueue

ConcurrentLinkedDeque  를 제공합니다.

7. 결론

 
이 사용방법(예제)에서는 Java 

Queue 

인터페이스에 대해 자세히 살펴보았습니다.먼저  Queue  가 하는 일과 Java가 제공 하는 구현을

살펴보았습니다  .

다음  으로 Queue 의 일반적인 FIFO 원칙과 순서가 다른 PriorityQueue 

를 살펴보았습니다  .

마지막으로

스레드 안전성

과  다중 스레드 환경에서

큐  를 사용하는 방법을 살펴보았습니다.

항상 그렇듯이 코드는

GitHub 에서

사용할 수 있습니다 .
Generic footer banner