[Java] 스레드 그룹/스레드 풀

Hyo Kyun Lee·2025년 1월 25일
0

Java

목록 보기
86/87

1. 개요

스레드 로컬 변수를 활용하기 위해 멀티스레드 동작상태를 한번 살펴보았고, 살펴보는 과정에 앞서 thread의 활성화 목록을 파악하였다.

thread의 활성화 목록은 크게 두가지 방법으로 알 수 있다.

  • 스레드 그룹
  • 스레드 풀

현재 실행중인 스레드 목록을 살펴볼 수 있었던 방법은 스레드 그룹이었다.

스레드 로컬 변수를 설정하기 위해 해당 서비스를 호출하는 시점에 무려 23개의 스레드들이 동작하고 있었다.

멀티스레드 환경은 내가 생각하는 것보다 훨씬 복잡하고 방대하였으며, 스레드그룹과 스레드 풀의 차이점을 명확하게 알아보고자, 나아가 향후에도 스레드들을 다루기 위한 배경지식을 함양하고자, 그 과정을 기록한다.

2. 스레드 그룹

스레드 그룹은 스레드들을 관리하기 위한 그룹으로, 일괄적으로 통제할 수 있는 interrupt 메소드를 사용할 수 있다는 특징이 있다.

thread 추상클래스를 보면 알 수 있겠지만, run메소드에서 Interruption 익셉션을 캐치하여 스레드를 종료한다.

이 interruptuon 익셉션을 스레드 그룹에서 유발할 수 있기에, 스레드그룹을 통해 스레드의 종료를 이끌어낼 수 있다는 결론을 얻을 수 있다.

  • 스레드는 반드시 하나의 스레드 그룹에 포함됨
  • 스레드 그룹을 통해서 스레드를 일괄적으로 통제함, interrupt() 메소드를 사용
  • JVM이 실행되면 system 스레드 그룹이 만들어지고, JVM 운영에 필요한 스레드들을 생성해 system 그룹에 포함시킴
  • system의 하위 스레드 그룹으로 main을 만들고 main 스레드를 포함시킴

지금까지 고생하면서 배워왔던 WAS와 접목시킨다면 이해가 쉬워진다.

  • 기본적으로 요청이 들어오면 이를 처리하기위해 웹컨테이너에서 스레드를 만들고 이 스레드가 서블릿 객체를 만들어 실제 서비스를 호출하기 위한 생명주기를 시작한다.
  • 즉, 기본적인 main 실행 스레드를 system 스레드그룹에 포함하는 것도 결국 하나의 요청인 것이고, 이 스레드가 이후 서블릿 객체를 만드는 등의 이후 과정을 거치는 것이다.
  • 이렇게하여 생긴 기본적인 스레드 그룹에서 사용자 요청이 있을때마다 스레드 생성, 서블릿 생성..등의 과정을 반복하여 진행한다.
  • JVM이 실행되면 system 스레드 그룹이 만들어지고, 이는 WAS가 생성한 웹컨테이너에 존재한다. 이 안에 존재하는 스레드와 서블릿으로 인해 로직을 진행한다.
  • 서블릿 객체는 요청당 하나이다. 즉 같은 요청이 들어오면 스레드가 하나 더 생기고, 이에 대한 경쟁상태가 발생한다. 이 경쟁상태를 안전하게 처리하는 과정이 동시성 제어이며 동기화 작업이다.

3. 스레드풀

스레드풀은 쉽게말하면 Runnable 스레드들을 executorService를 통해 별도의 작업공간을 할당하여 스레드그룹만으로는 비효율적일 수 있는 병렬처리를 더 효율적으로 처리할 수 있도록 도와준다.

스레드풀의 강력한 이점은 블로킹 방식, 즉 다른 스레드가 작업을 완료할때까지 블로킹을 할 수 있다는 점이고 이를 위해 스레드 작업 완료 시점을 알 수 있도록 마치 작업관리자와 같은 환경을 구현할 수 있다.

스레드 풀은 작업 처리 시 사용하는 스레드의 수를 정해 넣고 작업 큐에 들어오는 작업(run())들을 하나씩 생성한 스레드에 맡아 처리하며, 작업 처리가 끝난 스레드는 다시 큐에서 작업을 가져와 처리한다.

4. 참고자료

스레드와 WAS를 연결하기 위한 글 - https://velog.io/@semi-cloud/Spring-%EC%84%9C%EB%B8%94%EB%A6%BF

스레드그룹과 스레드풀 - https://m.blog.naver.com/qkrghdud0/220693345433

0개의 댓글

관련 채용 정보