[java] 워커 스레드와 작업 큐의 동작 방식

워커 스레드와 작업 큐는 멀티스레딩 환경에서 작업을 조율하는데 사용되는 중요한 개념입니다. 워커 스레드는 백그라운드에서 작업을 실행하는 스레드이며, 작업 큐는 작업을 대기열에 저장하고 순차적으로 실행하는 자료구조입니다.

워커 스레드의 역할

워커 스레드는 주로 CPU 작업이나 I/O 작업과 같이 시간이 오래 걸리는 작업을 백그라운드에서 비동기적으로 수행하는데 사용됩니다. 이를 통해 메인 스레드의 블로킹이나 지연을 최소화하여 응답성과 성능을 향상시킬 수 있습니다.

작업 큐의 역할

작업 큐는 워커 스레드가 처리할 작업들을 저장하는 대기열입니다. 작업은 FIFO(First-In-First-Out) 순서로 큐에 추가되며, 워커 스레드는 작업 큐에서 작업을 꺼내와 실행합니다. 작업 큐를 사용하면 여러 스레드에서 동시에 작업을 추가하고 실행할 수 있으며, 작업의 우선순위를 설정하여 효율적인 작업 조율이 가능합니다.

워커 스레드와 작업 큐의 동작 방식

워커 스레드와 작업 큐의 동작은 아래와 같은 흐름으로 이루어집니다.

  1. 워커 스레드는 작업 큐에서 작업을 가져옵니다.
  2. 가져온 작업을 실행합니다.
  3. 작업이 실행되는 동안 다른 스레드는 대기 상태입니다.
  4. 작업이 완료되면, 작업 결과를 반환하거나 필요에 따라 다른 작업을 작업 큐에 추가합니다.
  5. 워커 스레드는 다음 작업을 가져와서 반복적으로 실행합니다.

이러한 방식으로 워커 스레드와 작업 큐가 협력하여 작업을 조율하고 실행합니다.

예제 코드

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

public class WorkerThreadExample {
    public static void main(String[] args) {
        // 작업 큐 생성
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        // 작업 추가
        for (int i = 0; i < 5; i++) {
            final int taskNumber = i;
            executorService.execute(() -> {
                System.out.println("Task " + taskNumber + " executing by " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Task " + taskNumber + " completed");
            });
        }

        // 작업 큐 종료
        executorService.shutdown();
    }
}

위 예제에서는 ExecutorService를 사용하여 작업 큐를 생성하고, execute 메서드를 통해 작업을 추가합니다. 작업을 실행하는 동안에는 현재 작업 번호와 실행 스레드 이름을 출력하고, 1초간 대기 후 작업을 완료하는 예제입니다.

참고 자료