1. 소개
대기열
인터페이스에 대해 설명합니다.먼저 Queue 가 하는 일과 그 핵심 메소드를살펴
보겠습니다 . 다음 으로 Java가 표준으로 제공 하는 여러 구현에 대해 알아보겠습니다 .마지막으로 모든 것을 마무리하기 전에 스레드 안전성에 대해 이야기하겠습니다.2. Queue 시각화
Queue
를 선언한 후 새 요소를 뒤쪽에 추가하고 앞쪽에서 제거할 수 있습니다.사실, 우리가 자바에서 접하게 될대부분의 큐
는 선입선출 방식(흔히 FIFO로 축약됨)으로 작동합니다.그러나 한 가지 예외가 있습니다.3. 핵심 방법
Queue
는 모든 구현 클래스에서 코딩해야 하는 를 선언합니다 . 이제더 중요한 몇 가지를 요약해 보겠습니다 .
- offer() – 대기열 에 새 요소를 삽입합니다.
- poll() – 대기열 의 앞쪽에서 요소를 제거합니다.
- peek() – 큐 의 맨 앞에 있는 요소를 제거하지 않고
4. 추상 큐
Java가 제공하는 가장 간단한 가능한 Queue 구현입니다.
여기에는 offer를 제외한 일부 Queue
인터페이스 메서드의 골격 구현이 포함됩니다 .AbstractQueue
클래스를
확장 하는 사용자 지정 대기열을 만들 때 null 요소의 삽입을 허용 하지 않는 제안 메서드의 구현 을 제공해야 합니다.
또한 peek, poll, size 및 java.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. 대기열 차단
스레드가
현재 상태에 따라대기열 에서 대기하도록 하는 추가 작업을 지원합니다.
스레드는 검색을 시도할 때 큐 가 비어 있지 않을때까지 기다리
거나 새 요소를 추가할 때 비어 있을 때까지 기다릴 수 있습니다.표준차단 대기열
에는LinkedBlockingQueue, SynchronousQueue
및ArrayBlockingQueue
가 포함 됩니다.자세한 내용은 에 대한 기사를 참조하십시오 .4.2. 전송 대기열
인터페이스
를 확장 하지만생산자-소비자 패턴에 맞게 조정됩니다. 생산자에서 소비자로의 정보 흐름을 제어하여 시스템에 역압을 생성합니다.
Java는TransferQueue
인터페이스 의 한 구현인LinkedTransferQueue 와 함께 제공됩니다 .
4.3. 데크
Deque
는 Double -Ended
Queue 의 약자 이며 카드 한 벌과 유사합니다. 요소는 Deque의 시작과 끝 모두에서 가져올 수 있습니다 . 전통적인 Queue와 마찬가지로 Deque 는 상단과 하단 모두에 있는 요소를 추가, 검색 및 엿보기 위한 메서드를 제공합니다 .Deque
작동 방식에 대한 자세한 사용방법(예제)는 를 확인하세요 .5. 우선 순위 대기열
Java에서 접하는 대부분의 큐
가 FIFO 원칙을 따른다 는 것을 앞서 보았습니다 .이 규칙에 대한 한 가지 예외는 입니다. 새 요소가 우선 순위 대기열에 삽입되면 자연 순서에 따라 또는
우선 순위 대기열
을 구성할 때 제공되는 정의된 비교기 에 따라 정렬됩니다 .간단한 단위 테스트로 이것이 어떻게 작동하는지 살펴보겠습니다.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. 스레드 안전성
대기열
에 항목을 추가하는 것은 다중 스레드 환경에서 특히 유용합니다.큐
는 스레드 간에 공유될 수 있으며 공간이 확보될 때까지 진행을 차단하는 데 사용되어 일반적인 다중 스레드 문제를 극복하는 데 도움 이 됩니다.를 사용하여 단일 작성기 스레드를 생성하면 이 문제를 완화하고 쓰기 속도를 크게 향상시킬 수 있습니다.
운 좋게도 Java 는 스레드로부터 안전하고 다중 스레드 프로그램에 완벽한ConcurrentLinkedQueue, ArrayBlockingQueue
및ConcurrentLinkedDeque 를 제공합니다.
7. 결론
Queue
인터페이스에 대해 자세히 살펴보았습니다.먼저 Queue 가 하는 일과 Java가 제공 하는 구현을살펴보았습니다 .
다음 으로 Queue 의 일반적인 FIFO 원칙과 순서가 다른 PriorityQueue를 살펴보았습니다 .
마지막으로스레드 안전성
과 다중 스레드 환경에서큐 를 사용하는 방법을 살펴보았습니다.
항상 그렇듯이 코드는 사용할 수 있습니다 .