[java] 스택을 이용한 스레드 풀 구현하기

스레드 풀은 많은 작업을 관리하고 병렬로 실행하기 위해 사용되는 중요한 개념입니다. 스레드 풀을 구현하는 방법은 여러 가지가 있지만, 여기서는 스택을 이용하여 스레드 풀을 구현하는 방법을 알아보겠습니다.

스택의 개념

스택은 후입선출(LIFO) 방식으로 동작하는 자료 구조입니다. 가장 최근에 삽입된 데이터가 먼저 삭제되는 특징을 가지고 있습니다. 스택은 push(삽입), pop(삭제), peek(가장 상단 값 확인) 등의 연산을 지원합니다.

스택을 이용한 스레드 풀 구현하기

스레드 풀 클래스 설계

import java.util.Stack;

public class ThreadPool {
    private Stack<Runnable> stack;

    public ThreadPool() {
        stack = new Stack<>();
    }

    public synchronized void addTask(Runnable task) {
        stack.push(task);
        notify();
    }

    public synchronized Runnable getTask() throws InterruptedException {
        while (stack.isEmpty()) {
            wait();
        }
        return stack.pop();
    }
}

스레드 풀 사용 예제

public class Main {
    public static void main(String[] args) {
        ThreadPool threadPool = new ThreadPool();

        Thread producerThread = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                final int taskNumber = i;
                threadPool.addTask(() -> {
                    System.out.println("Task " + taskNumber + " executed by thread " + Thread.currentThread().getName());
                });
            }
        });

        Thread consumerThread = new Thread(() -> {
            try {
                while (true) {
                    Runnable task = threadPool.getTask();
                    task.run();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        producerThread.start();
        consumerThread.start();
    }
}

위의 예제에서는 ThreadPool 클래스를 이용하여 스레드 풀을 생성하고, 생산자 스레드(producerThread)에서 작업을 스레드 풀에 추가하고 소비자 스레드(consumerThread)에서 작업을 가져와 실행합니다.

결론

스택을 이용한 스레드 풀은 많은 작업을 효율적으로 관리하고 실행할 수 있는 방법입니다. 스택의 후입선출 방식을 활용하여 작업을 조절할 수 있으며, 여러 스레드 간의 작업 분배를 원활하게 할 수 있습니다.

참고 자료