본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)/Java 기본

Java ArrayBlockingQueue 기본 메서드 정리

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2022. 12. 2.

 

ArrayBlockingQueue는 배열(Array)로 구성된 큐(Queue) 입니다

가장 먼저 들어온 요소가 가장 먼저 빠지는 FIFO(선입선출) 형태로 이루어져 있습니다.

다중 스레드 환경에서 따로 동기화나 제어를 하지 않아도 블럭효과를(blocking, non - blocking) 보장 합니다.

* synchronized 키워드를 사용하지 않아도 됩니다.

 

기본적으로 new 연산자를 통해서 생성하며, 이때 큐 사이즈(크기)를 받습니다.

import java.util.concurrent.ArrayBlockingQueue;

{
    /**
      아래 큐 크기는 3이며, 3개 이상의 데이터를 넣을 수 없습니다.
      제네릭을 통해 원하는 자료형을 지정할 수 있습니다.
    */
    ArrayBlockingQueue<?> queue = new ArrayBlockingQueue<>(3);  
}

 

1. add(T)

 - 큐에 데이터를 추가 합니다.

 - 큐가 가득 찬 상태에서 데이터를 넣는다면 오류(IllegalStateException)가 발생 합니다.

import java.util.concurrent.ArrayBlockingQueue;

{
    ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
    try {
        queue.add("a");
        System.out.printf("[add] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());

        queue.add("b");
        System.out.printf("[add] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());

        queue.add("c"); // 오류 발생!
        System.out.printf("[add] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

2. offer(T)

 - 큐에 데이터를 추가 합니다.

 - 큐가 가득 찬 상태에서 데이터를 넣어도 아무 행동도 하지 않습니다.

import java.util.concurrent.ArrayBlockingQueue;

{
    ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
    try {
        queue.offer("a");
        System.out.printf("[add] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());

        queue.offer("b");
        System.out.printf("[add] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());

        queue.offer("c"); // 아무런 일도 일어나지 않습니다.
        System.out.printf("[add] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

3. offer(T, Integer, MILLISECONDS)

 - 큐에 데이터를 추가 합니다.

 - 큐가 가득 찬 상태에서 데이터를 넣는데 큐에 자리가 날 때 까지 주어진 시간 값 만큼 기다려 봅니다.

 - 해당 시간이 다 지났는데 자리가 없으면 데이터를 넣지 않고 종료 합니다.

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

{
    ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
    try {
        queue.offer("a", 2000, TimeUnit.MILLISECONDS);
        System.out.printf("[offer ready] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());

        queue.offer("b", 2000, TimeUnit.MILLISECONDS);
        System.out.printf("[offer ready] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());

        queue.offer("c", 2000, TimeUnit.MILLISECONDS);  //2초 대기하고 넘어갑니다.
        System.out.printf("[offer ready] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

4. put(T)

 - 큐에 데이터를 추가 합니다.

 - 큐가 가득 찬 상태라면 자리가 날 때 까지 계속 대기 합니다.

import java.util.concurrent.ArrayBlockingQueue;

{
    ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
    try {
        queue.put("a");
        System.out.printf("[put] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());

        queue.put("b");
        System.out.printf("[put] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());

        queue.put("c");  //자리가 빌 때 까지 대기 합니다.
        System.out.printf("[put] 큐 내용 : %s , 가용크기 : %d \n",queue, queue.remainingCapacity());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

5. take()

 - 큐에서 데이터를 가져 옵니다.

 - 데이터를 가져오기 때 문에 쌓여있는 큐의 크기가 줄어 듭니다.

 - 큐가 아무것도 없다면 데이터가 들어올 때 까지 무한 대기 합니다.

import java.util.concurrent.ArrayBlockingQueue;

{
    ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
    try {
        queue.put("a");
        queue.put("b");
        
        System.out.println(queue.take());
        System.out.println(queue.take());
        System.out.println(queue.take());  //데이터가 존재 할 때 까지 대기합니다.

    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

6. poll(), poll(Integer, MILLISECONDS)

 - 큐에서 데이터를 가져 옵니다.

 - 데이터를 가져오기 때 문에 쌓여있는 큐의 크기가 줄어 듭니다.

 - 데이터가 없다면 null을 반환 합니다.

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

{
    ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
    try {
        queue.put("a");
        queue.put("b");
        
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());  //null을 반환 합니다.
        System.out.println(queue.poll(2000, TimeUnit.MILLISECONDS));  //2초 기다려보고 null을 반환 합니다.

    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

7. peek()

 - 큐에서 맨 앞의 데이터를 가져옵니다.

 - 가져오기만 하고 큐 사이즈는 줄어들지 않습니다.

import java.util.concurrent.ArrayBlockingQueue;

{
    ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
    try {
        queue.put("a");
        queue.put("b");
        
        System.out.println(queue.peek());  //"a" 만 출력됩니다.
        System.out.println(queue.peek());  //"a" 만 출력됩니다.
        System.out.println(queue.peek());  //"a" 만 출력됩니다.

    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

이상으로 간단하게 살펴본 ArrayBlockingQueue 기본 메서드 정리였습니다.

궁금한점 또는 틀린 부분은 언제든 연락주세요! 👻

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글