웹사이트 검색

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 메서드에 대해 설명합니다.

  1. int size(): Set의 요소 수를 가져옵니다.
  2. 부울 isEmpty(): Set이 비어 있는지 확인합니다.
  3. boolean contains(Object o): 이 Set에 지정된 요소가 포함되어 있으면 true를 반환합니다.
  4. Iterator iterator(): 이 집합의 요소에 대한 반복자를 반환합니다. 요소는 특별한 순서 없이 반환됩니다.
  5. boolean removeAll(Collection c): 이 세트에서 지정된 컬렉션에 포함된 모든 요소를 제거합니다(선택적 작업).
  6. boolean retainAll(Collection c): 지정된 컬렉션에 포함된 이 집합의 요소만 유지합니다(선택적 작업).
  7. void clear(): 세트에서 모든 요소를 제거합니다.
  8. E remove(): 이 대기열의 헤드를 검색하고 제거합니다.
  9. E poll(): 이 대기열의 헤드를 검색 및 제거하거나 이 대기열이 비어 있으면 null을 반환합니다.
  10. E peek(): 이 큐의 헤드를 검색하지만 제거하지는 않습니다. 이 큐가 비어 있으면 null을 반환합니다.
  11. boolean offer(E e): 용량 제한을 위반하지 않고 즉시 수행할 수 있는 경우 지정된 요소를 이 대기열에 삽입합니다.
  12. E element(): 이 대기열의 헤드를 검색하지만 제거하지는 않습니다.
  13. boolean add(E e): 용량 제한을 위반하지 않고 즉시 수행할 수 있는 경우 지정된 요소를 이 대기열에 삽입하고, 성공 시 true를 반환하고 현재 사용 가능한 공간이 없으면 IllegalStateException을 발생시킵니다.
  14. 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 수집 프로그래밍을 시작하는 데 도움이 되기를 바랍니다. 내 튜토리얼이 마음에 들거나 제안 사항이나 문제가 있거나 오류가 있는 경우 댓글을 남겨주세요. 감사합니다.