ExecutorService

김도엽·2022년 7월 24일
0

Java Spring Boot

목록 보기
9/10

ExecutorService는 병렬작업 시 여러개의 작업을 효율적으로 처리하기 위해 제공되는 JAVA의 라이브러리이다.

통상적으로 작업을 분리하고 수행하는 작업을 손수 구현하고자 하면.. 각기 다른 Thread를 생성해서 작업을 처리하고, 처리가 완료되면 해당 Thread를 제거하는 작업을 진행해야 한다.

이러한 일련의 작업을 이 클래스를 이용해서 쉽게 처리가 가능하다.

흔히 말하는 ThreadPool을 구현하기가 매우 용이하므로, Java에서 쓰레드풀을 생성해서 사용하고자 하면 (손수 구축이 아닌.. 보장된 동작을 원한다면 이를 사용하길 적극 추천) 반드시 사용을 고려해봐야 할 유틸리티성 클래스이다.

  • CachedThreadPool : 쓰레드를 캐싱하는 쓰레드풀(사실 여기서 쓰이는 캐싱의 의미는 일정시간동안 쓰레드를 검사한다는 뜻.. 60초 동안 작업이 없으면 Pool에서 제거한다)
  • FixedThreadPool : 고정된 개수를 가진 쓰레드풀
  • SingleThreadExecutor : 한 개의 쓰레드로 작업을 처리하는 쓰레드풀.. 이라기보단 TaskPool의 개념이 더 적합할 것 같다.

아래는 내가 썼던 방식:

@Service
public class NotificationService {
    private final ExecutorService sseMvcExecutor = Executors.newSingleThreadExecutor();
//
...
//
    public void sendNotification(SseEmitter emitter, String eventId, Object data) {
        sseMvcExecutor.execute( () -> {
            try{
                emitter.send(SseEmitter.event()
                        .id(eventId)
                        .name("live")
                        .data(data));
                Thread.sleep( 1000);
                log.info("실제 전송 메서드: {}", data);
            }catch (IOException exception){
                emitterRepository.deleteById(eventId);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
    }
    ///
    ...
    ///

주의할점은, cachedThreadPool은 쓰레드수가 폭발적으로 증가할 수 있다는 점이다.

Thread의 제한 없이 무한정 생성하고, 해당 쓰레드의 작업이 60초간 없을 경우 Pool에서 제거하는 방식이기 때문에 작업이 계속적으로 쌓이는 환경에서는

해당 Thread가 소멸되는 것보다, 생성되는 양이 더 많을 것으로 사료된다.

SingleThread는.. 음.. 사실 큰 의미는 없다고 생각하면서도, 싱글 쓰레드의 작업을 처리할때 고려해야 할 race-condition이라던지 하는 부분들을 알아서 처리해주는 만큼, 독자적으로 구현하는 것보다 실 서비스에선 해당 클래스를 사용해봄직 하다고 생각한다.

그리고 fixedThreadPool을 생성할때, 해당 머신의 CPU코어수를 기준으로 생성하면 더 좋은 퍼포먼스를 얻을 수 있다.

Java에서 실행하는 머신의 CPU 코어수를 얻어오는 함수 -> 종종 쓰이니 알아두도록 하자

int coreCount = Runtime.getRuntime().availableProcessors();
profile
즐거운

0개의 댓글