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 기본 메서드 정리였습니다.
궁금한점 또는 틀린 부분은 언제든 연락주세요! 👻
'Java(자바) > Java 기본' 카테고리의 다른 글
Java String format 정리(자바 문자 형식 정리) (0) | 2022.11.28 |
---|---|
Java List Map 객체 정렬하기 (0) | 2022.09.05 |
Mybatis jdbctype(마이바티스 Jdbctype) (0) | 2022.07.18 |
재미있고 어려운 Java의 람다(lambda) (0) | 2022.04.07 |
자바 참조 데이터(Java Array, Java List) 사용간 유의 사항 (0) | 2022.03.21 |
댓글