Develop/Java

[자바] 오브젝트풀링 / Executors 클래스

_hong 2023. 2. 28. 18:35

오브젝트풀링 이란?

 

객체들을 매번 새로 생성/제거하지 않고 풀 안에 기존 객체들을 재사용하는 디자인 패턴

 

언제 사용할까?

스레드를 생성하고 수거할때 스택 메모리를 이용(할당, 초기화) 해야 하기 때문에 매번 생성하는 것은 비교적 비용이 높다.  

그래서 오브젝트 풀링 방식인 스레드풀을 사용해서 스레드를 재사용하면 오버헤드를 줄일 수 있다. 

또한 개발자 입장에서 스레드 마다 생명주기를 신경 쓰지 않아도 된다.

 

하지만 풀에  너무 많은 스레드를 생성해 놓는다면 메모리 낭비로 이어진다.

 

java.util.concorrent 패키지에 Executors 클래스를 사용해서 스레드 풀(Object polling 방식)을 사용할 수 있다.

Executors클래스는 Executor Service 인터페이스의 구현 객체를 생성해 준다.

Executor Service의 구현 객체는 Executors의 메서드들을 통해 스레드 풀의 사이즈, task queue에 task를 전달 할 수 있도록 해준다.

 

  • Executor 클래스
  • ExecutorService 인터페이스

 

Executors 클래스의 스레드 풀 생성 메소드

 

  • CachedThreadPool (): 스레드를 캐싱하는 쓰레드풀(사실 여기서 쓰이는 캐싱의 의미는 일정시간동안 쓰레드를 검사한다는 뜻.. 60초 동안 작업이 없으면 Pool에서 제거한다)
  • FixedThreadPool (): 고정된 개수를 가진 쓰레드풀

 

https://velog.io/@jsj3282/Threadpool

 

 

 

쓰레드 풀에게 작업 처리 요청을 하기 위해서는 execute(), submit() 2가지 메서드가 있다. 

 

1. execute()

 

  • 작업 처리 결과를 반환하지 않는다.
  • 작업 처리 도중 예외가 발생하면 스레드가 종료되고 해당 쓰레드는 쓰레드 풀에서 제거된다.
  • 다른 작업을 처리하기 위해 새로운 스레드를 생성한다.

 

2. submit()

  • 작업 처리 결과를 반환한다.
  • 작업 처리 도중 예외가 발생하더라도 스레드는 종료되지 않고 다음 작업을 위해 재사용된다.
  • 스레드의 생성 오버헤드 방지를 위해서라도 submit()을 가급적 사용한다.

 

Task queue의 장점 

 

1. submitter는 스레드풀을 사용 중에 blocking 되지 않는다. task를 큐에 저장해놓기만 하면 되기 때문에

2. submitter와 pool의 직접적인 connection이 생기지 않는다.

thread들이 정지되어도 submitter는 정상적으로 task를 저장할 수 있고 Submitter 가 중지되어도 스레드들은 큐에서 태스크를 가져올 수 있다.