[java] 쓰레드 풀의 다양한 활용 예제

자바에서 쓰레드를 효율적으로 관리하기 위해 쓰레드 풀(Thread Pool)을 사용할 수 있습니다. 쓰레드 풀은 미리 정해진 개수의 쓰레드를 유지하고 작업 큐에 들어오는 작업을 쓰레드가 처리하도록 합니다. 이를 통해 쓰레드의 생성과 제거에 따른 오버헤드를 줄이고, 시스템 자원을 효율적으로 활용할 수 있습니다.

1. 쓰레드 풀의 기본 사용 예제

쓰레드 풀을 기본적으로 사용하는 예제를 살펴보겠습니다.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 쓰레드 풀 생성
        ExecutorService threadPool = Executors.newFixedThreadPool(5);

        // 작업 제출
        for (int i = 0; i < 10; i++) {
            threadPool.execute(new Task(i));
        }

        // 쓰레드 풀 종료
        threadPool.shutdown();
    }
}

class Task implements Runnable {
    private int taskId;

    public Task(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {
        System.out.println("Task " + taskId + " is running.");
    }
}

위 예제에서는 ExecutorService를 사용하여 5개의 쓰레드를 유지하는 쓰레드 풀을 생성하고, 10개의 작업을 제출하여 실행하는 예제입니다.

2. 쓰레드 풀을 활용한 작업 처리 예제

쓰레드 풀을 이용하여 웹 서버에서 클라이언트 요청을 처리하는 예제를 살펴보겠습니다.

import java.io.*;
import java.net.*;
import java.util.concurrent.*;

public class WebServer {
    private static final int PORT = 8080;
    private static final ExecutorService threadPool = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(PORT);

        while (true) {
            Socket clientSocket = serverSocket.accept();
            threadPool.execute(() -> handleRequest(clientSocket));
        }
    }

    private static void handleRequest(Socket clientSocket) {
        // 클라이언트 요청 처리 로직
    }
}

위 예제에서는 쓰레드 풀을 이용하여 웹 서버를 생성하고, 클라이언트 요청을 쓰레드 풀의 쓰레드로 처리하는 예제입니다.

결론

쓰레드 풀은 적절하게 쓰레드를 관리할 수 있는 강력한 도구입니다. 다양한 상황에서 쓰레드 풀을 활용하여 시스템의 성능을 향상시킬 수 있으며, 적합한 상황에서의 적재적소의 활용이 중요합니다.