ExecutorService

greenTea·2023년 11월 18일
0

ExecutorService의 이해와 사용 방법

🥳자바의 ExecutorService는 스레드 풀을 생성해주는 메소드로 이를 통해 복잡한 멀티스레딩 관리를 단순화하고 관리를 쉽게 할 수 있습니다.

ExecutorService 란?

😑ExecutorService는 자바의 java.util.concurrent 패키지에 있는 인터페이스로, 스레드 풀 관리와 비동기 작업 실행을 위한 API를 제공합니다. 이를 사용하면 작업을 스레드에 할당하고, 작업 완료를 추적하며, 스레드 생명주기를 관리할 수 있습니다.

ExecutorService 생성하기

😎ExecutorService에서 스레드 풀을 만드는 데 사용되는 몇 가지 주요 메소드들이 있습니다. 상황에 맞게 자신에게 알맞은 스레드 풀을 생성하는데 도움을 줍니다.

주요 스레드 풀 생성 메소드

  1. newFixedThreadPool

    • Executors.newFixedThreadPool(int [원하는 스레드 개수])
    • 이 메소드는 고정된 수의 스레드를 갖는 스레드 풀을 생성합니다. 여기서 []는 풀 내에서 생성될 스레드의 개수를 지정합니다.
    • 이 고정된 개수의 스레드를 생성하기에 보통은 이 메소드를 자주 사용합니다.
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4); 
    //4개의 스레드를 갖는 스레드 풀 생성
  2. newCachedThreadPool

    • Executors.newCachedThreadPool()
    • 필요에 따라 새로운 스레드를 생성하고, 사용하지 않는 스레드는 일정 시간이 지나면 해제하는 유연한 스레드 풀을 만듭니다.
    • 작업 부하가 불규칙하거나 스레드 수가 동적으로 변해야 할 때 유용합니다.
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
  3. newSingleThreadExecutor

    • Executors.newSingleThreadExecutor()
    • 단일 스레드로 구성된 스레드 풀을 생성합니다. 모든 작업이 같은 스레드에서 순차적으로 실행됩니다.
    • 작업이 동시에 수행되지 않고 순차적으로 처리되어야 할 때 사용됩니다.
    ExecutorService singleThreadExecutor = 
    Executors.newSingleThreadExecutor();
  4. newScheduledThreadPool

    • Executors.newScheduledThreadPool(int corePoolSize)
    • 예약된 작업을 실행하기 위한 스레드 풀을 생성합니다.
    • 정기적이거나 지연된 작업 실행이 필요할 때 사용됩니다.
    ScheduledExecutorService scheduledThreadPool =Executors.newScheduledThreadPool(2);

사용시 주의사항

  • 😰생성된 스레드 풀은 반드시 종료되어야 합니다. shutdown 메소드를 통해 종료 할 수 있으며 만약 종료하지 않을 경우 시스템이 계속 실행됩니다.(main 메소드가 끝났음에도 불구하고 스레드풀이 종료되지 않았기에 더 남은 할일이 있는 것으로 파악하고 종료를 하지 않습니다.)

  • newCachedThreadPool은 필요에 따라 스레드를 무제한으로 생성할 수 있습니다. 그러므로 예측가능한 곳에서만 사용해야 합니다.

작업 제출하기

🧐Runnable 또는 Callable 작업을 ExecutorService에 제출할 수 있습니다. 각각 반환값이 없는 작업과 반환값이 있는 작업을 의미합니다.

executorService.submit(() -> {
    // 수행할 작업 내용
    System.out.println("Asynchronous task running");
});

//반환값이 없는 Runnalbe입니다. return으로 값을 반환하면 Callable

ExecutorService 종료하기

🤔작업이 모두 제출되면, ExecutorService를 종료해야 합니다. shutdown 메소드를 호출하여 스레드 풀을 종료합니다. 이미 제출된 작업은 완료되기 전까지 계속 실행됩니다.

executorService.shutdown();

예시 코드: FixedThreadPool 사용하기

🫠다음 예시 코드는 ExecutorService를 이용한 코드입니다.

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

public class sample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        for (int i = 0; i < 5; i++) {
            executor.submit(() -> {
                System.out.println(Thread.currentThread().getName());
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });
        }

        executor.shutdown();
        executor.awaitTermination(10, TimeUnit.SECONDS);
    }
}

😎위 코드는 2개의 스레드를 갖는 풀을 생성한 후에 작업을 진행하는 코드입니다.
awaitTermination()는 main이 스레드 풀의 작업이 끝날때가지 기다리게 해주는 메소드로 10초가 지난후에도 끝나지 않는다면 종료하는 메소드입니다.
shutdown()을 진행하게 되면 더 이상 새로운 작업을 받아서 진행하지 않는 다는 의미입니다.

위 코드를 실행하면 2개의 스레드가 5개의 작업을 진행하게 됩니다.

결과

pool-1-thread-1
pool-1-thread-2
pool-1-thread-1
pool-1-thread-2
pool-1-thread-1

profile
greenTea입니다.

0개의 댓글