BlockingQueue
자바는 생산자 소비자 문제를 해결하기 위해 java.util.concurrent.BlockingQueue
라는
특별한 멀티스레드 자료구조를 제공합니다
스레드를 차단할 수 있는 큐입니다
데이터 추가 차단
큐가 가득 차면 데이터 추가 작업(put())을 시도하는 스레드는 공간이 생길 때까지 차단합니다
데이터 획득 차단
큐가 비어있으면 획득 작업(take())을 시도하는 스레드는 큐에 데이터가 들어올 때까지 차단됩니다
인터페이스와 주요 기능
BlockingQueue는 인터페이스며, 다양한 메소드를 제공합니다
데이터 추가 메소드로 add, offer등을 제공하며, 데이터 획득 메소드로 take, poll(타임아웃)을 제공합니다
또한 Queue를 상속받아서 큐의 기능도 사용할 수 있습니다
대표적인 구현체
BlockingQueue의 대표적인 구현체는 다음과 같습니다
- ArrayBlockingQueue: 배열 기반으로 구현되어 있고, 버퍼의 크기가 고정되어 있습니다
- LinkedBlockingQueue: 링크 기반으로 구현되어있고, 버퍼의 크기를 고정하거나 무한하게 사용할 수도 있습니다
ArrayBlokcingQueue
ArrayBlockingQueue는 내부에서 ReentrantLock을 사용합니다
그리고 생산자 전용 대기실과 소비자 전용 대기실이 있습니다
버퍼가 가득차면 생산자 스레드는 생산자 전용 대기실에서 대기하고, 생산자 스레드가 생산을 완료하면
소비자 전용 대기실에 signal()로 신호를 전달합니다
또한 lock.lockInterruptibly()를 사용했습니다
큐가 가득찼을 때 선택지
- 예외를 던지고 받아 처리한다
- 대기하지 않고 즉시 false를 반환한다
- 대기한다
- 특정시간 동안 대기한다
BlockingQueue는 각 상황에 맞는 다양한 메소드를 제공합니다
Operation | Throw 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() | not applicable | not applicable |
Throw Excepion - 대기시 예외
- add(e) 요소를 큐에 저장하고 큐가 가득차면 IllegalStateException 예외를 던집니다
- remove(): 큐에서 요소를 제거하고 반환합니다. 큐가 비어있으면 NoSuchElementException 예외를 던집니다
- element(): 큐의 머리 요소를 반환하지만 요소를 큐에서 제거하지 않습니다
큐가 비어있으면 NoSuchElementException 예외를 던집니다
Special Value - 대기시 즉시 반환
- offer(e): 지정된 요소를 큐에 추가하려고 시도하며, 큐가 가득차면 false를 반환합니다
- poll(): 큐에서 요소를 제거하고 반환합니다. 큐가 비어있으면 null을 반환합니다
- peek(): 큐의 head 요소를 반환하지만 요소를 큐에서 제거하지 않으며 비어있으면 null을 반환합니다
Blocks - 대기
- put(e): 지정된 요소를 큐에 추가할 때까지 대기합니다 큐가 가득차면 공간이 생길 때까지 대기합니다
- take(): 큐에서 요소를 제거하고 반환합니다 큐가 비어있으면 요소가 준비될 때까지 대기합니다
- Examine (관찰): 해당사항 없음
Times out - 시간 대기
- offer(e, time, unit): 지정된 요소를 큐에 추가하려고 시도하며, 지정된 시간동안 큐가 비어지기를 기다렸다가
시간이 초과되면 false를 반환합니다
- poll(time, unit): 큐에서 요소를 제거하고 반환합니다. 큐에 요소가 없다면 지정된 시간동안 요소가 준비되기를 기다리다가 시간이 초과되면 null을 반환합니다
- Examine(관찰): 해당사항 없음
참고로 BlockingQueue의 모든 대기, 시간 대기 메소드는 인터럽트를 제공합니다
참고