Java 대기열 – Java의 대기열

자바 대기열
이 섹션에서는 Java Queue에 대한 몇 가지 중요한 사항에 대해 설명합니다.
- java.util.Queue 인터페이스는 java.util.Collection 인터페이스의 하위 유형입니다.
- 실제 대기열(예: 은행 또는 ATM)과 마찬가지로 Queue는 대기열 끝에 요소를 삽입하고 대기열 시작 부분에서 제거합니다.
- Java Queue는 정렬된 요소 목록을 나타냅니다.
- Java Queue는 FIFO 순서에 따라 요소를 삽입하고 제거합니다. FIFO는 First In First Out의 약자입니다.
- Java Queue는 Collection 인터페이스의 모든 메소드를 지원합니다.
- 가장 자주 사용되는 대기열 구현은 LinkedList, ArrayBlockingQueue 및 PriorityQueue입니다.
- BlockingQueues는 null 요소를 허용하지 않습니다. null 관련 작업을 수행하면 NullPointerException이 발생합니다.
- BlockingQueues는 생산자/소비자 기반 애플리케이션을 구현하는 데 사용됩니다.
- BlockingQueue는 스레드로부터 안전합니다.
- java.util 패키지에서 사용 가능한 모든 대기열은 무제한 대기열이고 java.util.concurrent 패키지에서 사용 가능한 대기열은 제한 대기열입니다.
- 모든 Deque는 스레드로부터 안전하지 않습니다.
- ConcurrentLinkedQueue는 연결된 노드를 기반으로 하는 무제한 스레드 안전 대기열입니다.
- 모든 대기열은 Deques를 제외하고 대기열의 끝에서 삽입 및 대기열의 머리에서 제거를 지원합니다.
- 데크는 대기열이지만 양쪽 끝에서 요소 삽입 및 제거를 지원합니다.

Java 대기열 클래스 다이어그램

자바 대기열 방법
이 섹션에서는 유용하고 자주 사용되는 몇 가지 Java Queue 메서드에 대해 설명합니다.
- int size(): Set의 요소 수를 가져옵니다.
- 부울 isEmpty(): Set이 비어 있는지 확인합니다.
- boolean contains(Object o): 이 Set에 지정된 요소가 포함되어 있으면 true를 반환합니다.
- Iterator iterator(): 이 집합의 요소에 대한 반복자를 반환합니다. 요소는 특별한 순서 없이 반환됩니다.
- boolean removeAll(Collection c): 이 세트에서 지정된 컬렉션에 포함된 모든 요소를 제거합니다(선택적 작업).
- boolean retainAll(Collection c): 지정된 컬렉션에 포함된 이 집합의 요소만 유지합니다(선택적 작업).
- void clear(): 세트에서 모든 요소를 제거합니다.
- E remove(): 이 대기열의 헤드를 검색하고 제거합니다.
- E poll(): 이 대기열의 헤드를 검색 및 제거하거나 이 대기열이 비어 있으면 null을 반환합니다.
- E peek(): 이 큐의 헤드를 검색하지만 제거하지는 않습니다. 이 큐가 비어 있으면 null을 반환합니다.
- boolean offer(E e): 용량 제한을 위반하지 않고 즉시 수행할 수 있는 경우 지정된 요소를 이 대기열에 삽입합니다.
- E element(): 이 대기열의 헤드를 검색하지만 제거하지는 않습니다.
- boolean add(E e): 용량 제한을 위반하지 않고 즉시 수행할 수 있는 경우 지정된 요소를 이 대기열에 삽입하고, 성공 시 true를 반환하고 현재 사용 가능한 공간이 없으면 IllegalStateException을 발생시킵니다.
- Object[] toArray(): 이 집합의 모든 요소를 포함하는 배열을 반환합니다. 이 세트가 반복자에 의해 요소가 반환되는 순서를 보장하는 경우 이 메서드는 요소를 동일한 순서로 반환해야 합니다.
Java 대기열 기본 사항
Java Queue는 Java Collection을 확장하므로 모든 Collection 인터페이스 작업도 지원합니다. 다음 예제에서 몇 가지 간단한 작업을 살펴보겠습니다.
package com.journaldev.queue;
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
queue.add("two");
queue.add("three");
queue.add("four");
System.out.println(queue);
queue.remove("three");
System.out.println(queue);
System.out.println("Queue Size: " + queue.size());
System.out.println("Queue Contains element 'two' or not? : " + queue.contains("two"));
// To empty the queue
queue.clear();
}
}
산출:-
[one, two, three, four]
[one, two, four]
Queue Size: 3
Queue Contains element 'two' or not? : true
대기열에 Java 배열
여기서 우리는 "Collections.addAll()\ 메서드를 사용하여 Java 배열을 Queue로 변환하는 방법을 하나의 간단한 예와 함께 탐색할 수 있습니다.
import java.util.*;
public class ArrayToQueue {
public static void main(String[] args) {
String nums[] = {"one","two","three","four","five"};
Queue<String> queue = new LinkedList<>();
Collections.addAll(queue, nums);
System.out.println(queue);
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
[one, two, three, four, five]
배열에 대한 Java 대기열
여기에서는 "toArray()\를 사용하여 Java Queue를 Java Array로 변환하는 방법을 간단한 예제와 함께 살펴봅니다.
import java.util.*;
public class QueueToArray {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
queue.add("two");
queue.add("three");
queue.add("four");
queue.add("five");
String strArray[] = queue.toArray(new String[queue.size()]);
System.out.println(Arrays.toString(strArray));
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
[one, two, three, four, five]
Java 대기열 일반 작업
Java Queue는 Collection 인터페이스에서 지원하는 모든 작업과 일부 추가 작업을 지원합니다. 두 가지 형태로 거의 모든 작업을 지원합니다.
- 작업이 실패하면 한 세트의 작업에서 예외가 발생합니다.
- 다른 작업 세트는 작업이 실패하면 특별한 값을 반환합니다.
다음 표에서는 모든 Queue 일반 작업을 간략하게 설명합니다.
Operation | Throws exception | Special value |
---|---|---|
Insert | add(e) | offer(e) |
Remove | remove() | poll() |
Examine | element() | peek() |
각 작업을 선택하고 다음 섹션에서 몇 가지 유용한 예제를 통해 자세히 논의할 것입니다.
Java 대기열 삽입 작업
이 섹션에서는 몇 가지 유용한 예제와 함께 Java Queue 삽입 작업에 대해 자세히 설명합니다. 이 작업이 성공적으로 수행되면 "true\ 값을 반환합니다. 우리가 알고 있듯이 Queue는 두 가지 형식으로 삽입 작업을 지원합니다.
- Queue.add(e): 작업이 실패하면 예외가 발생합니다.- Queue.offer(e):\n작업이 실패하면 특별한 값을 반환합니다.
참고:- 여기서 특수 값은 \false 또는 \null일 수 있습니다.
대기열 추가() 작업
add() 작업은 새 요소를 대기열에 삽입하는 데 사용됩니다. 삽입 작업을 성공적으로 수행하면 "true\ 값을 반환합니다. 그렇지 않으면 java.lang.IllegalStateException이 발생합니다. 이 기능을 보여주는 간단한 예제를 하나 개발해 보겠습니다.
import java.util.concurrent.*;
public class QueueAddOperation {
public static void main(String[] args) {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
System.out.println(queue.add("one"));
System.out.println(queue.add("two"));
System.out.println(queue);
System.out.println(queue.add("three"));
System.out.println(queue);
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
true
true
[one, two]
Exception in thread "main" java.lang.IllegalStateException: Queue full
큐는 두 개의 요소로 제한되므로 BlockingQueue.add()를 사용하여 세 번째 요소를 추가하려고 하면 위와 같이 예외가 발생합니다.
대기열 제공() 작업
offer() 작업은 새 요소를 대기열에 삽입하는 데 사용됩니다. 삽입 작업을 성공적으로 수행하면 "true\ 값을 반환하고 그렇지 않으면 "false\ 값을 반환합니다. 이 기능을 시연하기 위해 하나의 간단한 예제를 개발해 보겠습니다.
import java.util.concurrent.*;
public class QueueOfferOperation {
public static void main(String[] args) {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
System.out.println(queue.offer("one"));
System.out.println(queue.offer("two"));
System.out.println(queue);
System.out.println(queue.offer("three"));
System.out.println(queue);
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
true
true
[one, two]
false
[one, two]
큐가 두 개의 요소로 제한되어 있으므로 BlockingQueue.offer() 작업을 사용하여 세 번째 요소를 추가하려고 하면 위와 같이 "false\ 값을 반환합니다.
Java 대기열 삭제 작업
이 섹션에서는 몇 가지 유용한 예제와 함께 Java Queue Delete 작업에 대해 자세히 설명합니다. 삭제 작업은 성공적으로 수행되는 경우 대기열의 헤드 요소를 반환합니다. 알다시피 Queue는 다음 두 가지 형식으로 삭제 작업을 지원합니다.
- Queue.remove(): 작업이 실패하면 예외가 발생합니다.- Queue.poll():\n작업이 실패하면 특별한 값을 반환합니다.
참고:- 여기서 특수 값은 \false 또는 \null일 수 있습니다.
대기열 제거() 작업
remove() 작업은 큐의 헤드에서 요소를 삭제하는 데 사용됩니다. 삭제 작업을 성공적으로 수행하면 대기열의 헤드 요소를 반환합니다. 그렇지 않으면 java.util.NoSuchElementException이 발생합니다. 이 기능을 시연하기 위해 하나의 간단한 예제를 개발해 보겠습니다.
import java.util.*;
public class QueueRemoveOperation
{
public static void main(String[] args)
{
Queue<String> queue = new LinkedList<>();
queue.offer("one");
queue.offer("two");
System.out.println(queue);
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
[one, two]
one
two
Exception in thread "main" java.util.NoSuchElementException
큐에는 두 개의 요소만 있으므로 remove() 메서드를 세 번째로 호출하려고 하면 위와 같이 예외가 발생합니다. 참고:- Queue.remove(요소)는 대기열에서 지정된 요소를 삭제하는 데 사용됩니다. 삭제 작업을 성공적으로 수행하면 "true\ 값을 반환하고 그렇지 않으면 "false\ 값을 반환합니다.
Queue poll() 작업
poll() 작업은 큐의 헤드에서 요소를 삭제하는 데 사용됩니다. 삭제 작업을 성공적으로 수행하면 대기열의 헤드 요소를 반환합니다. 그렇지 않으면 "null\ 값을 반환합니다. 이 기능을 보여주는 간단한 예제를 하나 개발해 보겠습니다.
import java.util.*;
public class QueuePollOperation
{
public static void main(String[] args)
{
Queue<String> queue = new LinkedList<>();
queue.offer("one");
queue.offer("two");
System.out.println(queue);
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
[one, two]
one
two
null
우리 큐는 두 개의 요소만 가지고 있기 때문에 세 번째로 poll() 메서드를 호출하려고 하면 위와 같이 null 값을 반환합니다.
Java 대기열 검사 작업
이 섹션에서는 몇 가지 유용한 예제와 함께 Java Queue Examine 작업에 대해 자세히 설명합니다. 이 작업이 성공적으로 수행되면 큐의 헤드 요소를 제거하지 않고 반환합니다. 알다시피 Queue는 검사 작업을 두 가지 형식으로 지원합니다.
- Queue.element(): 작업이 실패하면 예외가 발생합니다.- Queue.peek():\n작업이 실패하면 특별한 값을 반환합니다.
참고:- 여기서 특수 값은 \false 또는 \null일 수 있습니다.
큐 요소() 작업
element() 작업은 제거하지 않고 대기열의 헤드에서 요소를 검색하는 데 사용됩니다. 검사 작업을 성공적으로 수행하면 큐의 헤드 요소를 반환합니다. 그렇지 않으면 java.util.NoSuchElementException이 발생합니다. 이 기능을 시연하기 위해 하나의 간단한 예제를 개발해 보겠습니다.
import java.util.*;
public class QueueElementOperation {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
System.out.println(queue.element());
System.out.println(queue);
queue.clear();
System.out.println(queue.element());
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
one
[one]
Exception in thread "main" java.util.NoSuchElementException
빈 Queue에서 element() 메서드를 호출하려고 하면 위와 같이 예외가 발생합니다.
Queue peek() 작업
peek() 작업은 제거하지 않고 큐의 헤드에서 요소를 검색하는 데 사용됩니다. 검사 작업을 성공적으로 수행하면 큐의 헤드 요소를 반환합니다. 그렇지 않으면 null 값을 반환합니다. 이 기능을 시연하기 위해 하나의 간단한 예제를 개발해 보겠습니다.
import java.util.*;
public class QueuePeekOperation {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
System.out.println(queue.peek());
System.out.println(queue);
queue.clear();
System.out.println(queue.peek());
}
}
출력:- 위의 프로그램을 실행하면 다음과 같은 출력이 표시됩니다.
one
[one]
null
빈 Queue에서 peek() 메서드를 호출하려고 하면 null 값을 반환하지만 위와 같이 예외를 throw하지는 않습니다.
Java 대기열 범주
Java에서는 많은 Queue 구현을 찾을 수 있습니다. W는 크게 다음 두 가지 유형으로 분류할 수 있습니다.
- 제한된 대기열
- 제한되지 않은 대기열
Bounded Queues는 생성 시 대기열의 최대 크기를 제공해야 함을 의미하는 용량으로 제한되는 대기열입니다. 예를 들어 ArrayBlockingQueue(이전 예제 참조). Unbounded Queues는 용량에 의해 제한되지 않는 대기열입니다. 즉, 대기열의 크기를 제공해서는 안 됩니다. 예를 들어 LinkedList(이전 예제 참조). java.util 패키지에서 사용할 수 있는 모든 대기열은 Unbounded Queues이고 java.util.concurrent 패키지에서 사용할 수 있는 Queues는 Bounded Queues입니다. 다른 방법으로 W는 이를 다음 두 가지 유형으로 크게 분류할 수 있습니다.
- 차단 대기열
- 비차단 대기열
BlockingQueue 인터페이스를 구현하는 모든 Queue는 BlockingQueue이고 나머지는 Non-Blocking Queue입니다. BlockingQueues는 작업이 완료되거나 시간이 초과될 때까지 차단하지만 Non-BlockingQueues는 그렇지 않습니다. 일부 대기열은 Deques이고 일부 대기열은 PriorityQueues입니다.
BlockingQueue 작업
Queue의 두 가지 형태의 작업 외에도 BlockingQueue는 아래와 같이 두 가지 형태를 더 지원합니다.
Operation | Throws exception | Special value | Blocks | Times out |
---|---|---|---|---|
Insert | add(e) | offer(e) | put(e) | offer(e, time, unit) |
Remove | remove() | poll() | take() | poll(time, unit) |
Examine | element() | peek() | N/A | N/A |
일부 작업은 작업이 완료될 때까지 차단되고 다른 작업은 시간 초과될 때까지 차단됩니다. 이것이 Java의 Queue에 대한 빠른 요약입니다. 이 Java Queue 예제가 Queue 수집 프로그래밍을 시작하는 데 도움이 되기를 바랍니다. 내 튜토리얼이 마음에 들거나 제안 사항이나 문제가 있거나 오류가 있는 경우 댓글을 남겨주세요. 감사합니다.