English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 가이드

Java 흐름 제어

Java 배열

Java 지향형 객체(I)

Java 지향형 객체(II)

Java 지향형 객체(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 집합

Java Set 집합

Java 입력/출력(I/O)

Java Reader/Writer

Java 다른 주제

Java ArrayBlockingQueue

이 튜토리얼에서는 ArrayBlockingQueue 클래스와 그 메서드를 예제를 통해 배우겠습니다.

Java Collections 프레임워크의 ArrayBlockingQueue 클래스는 배열을 사용한 블록 큐 구현을 제공합니다.

그것은Java BlockingQueue 인터페이스.

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 메서드

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()과 take()를 사용하여 스레드의 작업을 블록하고 다른 스레드와 동기화할 수 있습니다. 이 메서드들은 성공적으로 실행될 때까지 기다립니다.

put() 메서드

요소를 데이터 블록링 큐의 끝에 추가하려면 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() 메서드

데이터 블록링 큐의 앞쪽에서 요소를 반환하고 제거하려면 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)배열 블록 큐에서 지정된 요소를 검색합니다.요소가 발견되면 true를 반환하고, 발견되지 않으면 false를 반환합니다.
size()배열 블록 큐의 길이를 반환합니다.
toArray()배열 블록 큐를 배열로 변환하고 반환합니다.
toString()배열 블록 큐를 문자열로 변환

왜 ArrayBlockingQueue를 사용해야 합니까?

ArrayBlockingQueue는 내부 저장소로 배열을 사용합니다.

그것은 다음과 같이 생각됩니다스레드 보안집합입니다. 따라서, 이는 일반적으로 멀티스레드 애플리케이션에서 사용됩니다.

한 스레드가 요소를 큐에 삽입하고 다른 스레드가 큐에서 요소를 제거하는 경우를 가정해 보겠습니다.

현재, 첫 번째 스레드가 두 번째 스레드보다 느리다면, 배열 블록 큐는 두 번째 스레드가 첫 번째 스레드가 그 작업을 완료할 때까지 기다릴 수 있습니다.