SeouliteLab

Java에서 ArrayBlockingQueue를 활용한 스레드간 안전한 데이터 전달 방법 본문

프로그래밍

Java에서 ArrayBlockingQueue를 활용한 스레드간 안전한 데이터 전달 방법

Seoulite Lab 2024. 3. 26. 14:06

소개:
Java에서 ArrayBlockingQueue는 고정 크기의 배열을 기반으로 한 스레드 안전한 큐 구현체입니다. 이 글에서는 ArrayBlockingQueue를 사용하여 스레드 간에 안전하게 데이터를 전달하고 처리하는 방법에 대해 알아보겠습니다.

ArrayBlockingQueue 소개:
ArrayBlockingQueue는 java.util.concurrent 패키지에 포함되어 있으며, 고정된 크기의 배열을 기반으로 한 블로킹 큐입니다. 큐에 데이터를 추가하거나 제거할 때 스레드 안전하게 동작하며, 큐가 가득 차거나 비어 있을 때 블로킹됩니다.

설정:
Java 5 이상 버전에서는 ArrayBlockingQueue 클래스를 사용할 수 있습니다.

예제 1: ArrayBlockingQueue를 사용하여 스레드 간 데이터 전달

import java.util.concurrent.ArrayBlockingQueue;

public class ArrayBlockingQueueExample {
    public static void main(String[] args) {
        ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(5);

        // Producer 스레드: 큐에 데이터 추가
        Thread producer = new Thread(() -> {
            for (int i = 1; i <= 5; i++) {
                try {
                    queue.put(i); // 데이터 추가
                    System.out.println("Producer: " + i + " 추가");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // Consumer 스레드: 큐에서 데이터 제거
        Thread consumer = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                try {
                    int value = queue.take(); // 데이터 제거
                    System.out.println("Consumer: " + value + " 제거");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        producer.start();
        consumer.start();
    }
}

출력 결과:

Producer: 1 추가
Producer: 2 추가
Producer: 3 추가
Consumer: 1 제거
Producer: 4 추가
Consumer: 2 제거
Producer: 5 추가
Consumer: 3 제거
Consumer: 4 제거
Consumer: 5 제거

ArrayBlockingQueue 설명:
위 예제에서는 ArrayBlockingQueue를 사용하여 Producer 스레드가 큐에 데이터를 추가하고, Consumer 스레드가 큐에서 데이터를 제거하는 방법을 보여줍니다. 큐가 가득 차거나 비어 있으면 스레드가 블로킹되어 대기하므로, 데이터 전달 과정에서 안전하게 처리됩니다.