English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 ArrayBlockingQueue 클래스와 그 메서드를 예제를 통해 배우겠습니다.
Java Collections 프레임워크의 ArrayBlockingQueue 클래스는 배열을 사용한 블록 큐 구현을 제공합니다.
배열 블록 큐를 생성하기 위해 java.util.concurrent.ArrayBlockingQueue 패키지를 가져오는 것이 필요합니다.
패키지를 가져온 후, 다음과 같은 방법으로 Java에서 배열 블록 큐를 생성할 수 있습니다:
ArrayBlockingQueue<Type> animal = new ArrayBlockingQueue<>(int capacity);
이곳에서는
Type - 배열 블록 큐의 타입
capacity - 배열 블록 큐의 크기
예를 들어,
//크기가5의 문자형 ArrayBlockingQueue ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>();5); //크기가5의 정수형 ArrayBlockingQueue ArrayBlockingQueue<Integer> age = new ArrayBlockingQueue<>(5);
주의:배열의 크기를 제공해야 합니다.
ArrayBlockingQueue 클래스는 BlockingQueue 인터페이스에 모든 메서드를 구현합니다.
이 메서드들은 배열 블록 큐에서 요소를 삽입, 접근 및 제거하는 데 사용됩니다.또한, put()와 take() 두 가지 메서드를 배웁니다. 이들은 배열 블록 큐에서 블록 작업을 지원합니다.
이 두 가지 메서드는 배열 블록 큐를 다른 표준 큐와 구분합니다.
add() - 지정된 요소를 배열 블록 큐에 삽입합니다. 큐가 가득 차면 예외를 발생시킵니다.
offer() - 지정된 요소를 배열 블록 큐에 삽입합니다. 큐가 가득 차면 false를 반환합니다.
예를 들어,
import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>();5); //사용하기 add() animals.add("Dog"); animals.add("Cat"); //사용하기 offer() animals.offer("Horse"); System.out.println("ArrayBlockingQueue: "); + animals); } }
출력 결과
ArrayBlockingQueue: [Dog, Cat, Horse]
peek() - 배열 블로킹 큐의 앞쪽에서 요소를 반환합니다. 공간이 비어 있다면 null을 반환합니다.
iterator() - 순서대로 배열 블로킹 큐의 요소를 접근할 수 있는 이터레이터 객체를 반환합니다. 공간이 비어 있다면 예외를 발생시킵니다. 이터레이터를 사용하기 위해 java.util.Iterator 패키지를 가져오아야 합니다.
예를 들어,
import java.util.concurrent.ArrayBlockingQueue; import java.util.Iterator; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>();5); //요소 추가 animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: "); + animals); // 사용하기 peek() String element = animals.peek(); System.out.println("접근 요소: ") + element); // 사용하기 iterator() Iterator<String> iterate = animals.iterator(); System.out.print("ArrayBlockingQueue 요소: "); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
출력 결과
ArrayBlockingQueue: [Dog, Cat, Horse] 접근 요소: Dog ArrayBlockingQueue 요소: Dog, Cat, Horse,
remove() - 지정된 요소를 반환하고 배열 블로킹 큐에서 제거합니다. 공간이 비어 있다면 예외를 발생시킵니다.
poll() - 지정된 요소를 반환하고 배열 블로킹 큐에서 제거합니다. 공간이 비어 있다면 null을 반환합니다.
clear() - 배열 블로킹 큐에서 모든 요소를 제거합니다.
예를 들어,
import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>();5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: "); + animals); // 사용하기 remove() String element1 = animals.remove(); System.out.println("요소를 제거할 수 있습니다:") System.out.println("사용하기 remove(): ") + element1); // 사용하기 poll() String element2 = animals.poll(); System.out.println("사용하기 poll(): ") + element2); // 사용하기 clear() animals.clear(); System.out.println("업데이트된 ArrayBlockingQueue: ") + animals); } }
출력 결과
ArrayBlockingQueue: [Dog, Cat, Horse] 요소를 제거하기: remove()을 사용하여: Dog poll()을 사용하여: Cat 수정된 ArrayBlockingQueue: []
다중 스레드 프로세스에서는 put()과 take()를 사용하여 스레드의 작업을 블록하고 다른 스레드와 동기화할 수 있습니다. 이 메서드들은 성공적으로 실행될 때까지 기다립니다.
요소를 데이터 블록링 큐의 끝에 추가하려면 put() 메서드를 사용할 수 있습니다.
데이터 블록링 큐가 가득 차면, 요소를 추가할 공간이 데이터 블록링 큐에 들어오기까지 기다립니다.
예를 들어,
import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>();5); try { //요소를 animals에 추가하기 animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: "); + animals); } catch(Exception e) { System.out.println(e); } } }
출력 결과
ArrayBlockingQueue: [Dog, Cat]
여기서 put() 메서드가 대기 중에 중지되면 InterruptedException이 발생할 수 있습니다. 따라서 try..catch 블록에 포함해야 합니다.
데이터 블록링 큐의 앞쪽에서 요소를 반환하고 제거하려면 take() 메서드를 사용할 수 있습니다.
데이터 블록링 큐가 비어 있으면, 제거할 요소가 데이터 블록링 큐에 들어오기까지 기다립니다.
예를 들어,
import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>();5); try { //요소를 animals에 추가하기 animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: "); + animals); //요소를�除하기 String element = animals.take(); System.out.println("삭제된 요소: "); + element); } catch(Exception e) { System.out.println(e); } } }
출력 결과
ArrayBlockingQueue: [Dog, Cat] 삭제된 요소: Dog
여기서 take() 메서드가 대기 중에 중지되면 InterruptedException 예외가 발생합니다. 따라서 try…catch 블록에 포함해야 합니다.
메서드 | 내용 설명 |
---|---|
contains(element) | 배열 블록 큐에서 지정된 요소를 검색합니다. |
size() | 배열 블록 큐의 길이를 반환합니다. |
toArray() | 배열 블록 큐를 배열로 변환하고 반환합니다. |
toString() | 배열 블록 큐를 문자열로 변환 |
ArrayBlockingQueue는 내부 저장소로 배열을 사용합니다.
그것은 다음과 같이 생각됩니다스레드 보안집합입니다. 따라서, 이는 일반적으로 멀티스레드 애플리케이션에서 사용됩니다.
한 스레드가 요소를 큐에 삽입하고 다른 스레드가 큐에서 요소를 제거하는 경우를 가정해 보겠습니다.
현재, 첫 번째 스레드가 두 번째 스레드보다 느리다면, 배열 블록 큐는 두 번째 스레드가 첫 번째 스레드가 그 작업을 완료할 때까지 기다릴 수 있습니다.