스레드 로컬 변수를 활용하기 위해 멀티스레드 동작상태를 한번 살펴보았고, 살펴보는 과정에 앞서 thread의 활성화 목록을 파악하였다.
thread의 활성화 목록은 크게 두가지 방법으로 알 수 있다.
현재 실행중인 스레드 목록을 살펴볼 수 있었던 방법은 스레드 그룹이었다.
스레드 로컬 변수를 설정하기 위해 해당 서비스를 호출하는 시점에 무려 23개의 스레드들이 동작하고 있었다.
멀티스레드 환경은 내가 생각하는 것보다 훨씬 복잡하고 방대하였으며, 스레드그룹과 스레드 풀의 차이점을 명확하게 알아보고자, 나아가 향후에도 스레드들을 다루기 위한 배경지식을 함양하고자, 그 과정을 기록한다.
스레드 그룹은 스레드들을 관리하기 위한 그룹으로, 일괄적으로 통제할 수 있는 interrupt 메소드를 사용할 수 있다는 특징이 있다.
thread 추상클래스를 보면 알 수 있겠지만, run메소드에서 Interruption 익셉션을 캐치하여 스레드를 종료한다.
이 interruptuon 익셉션을 스레드 그룹에서 유발할 수 있기에, 스레드그룹을 통해 스레드의 종료를 이끌어낼 수 있다는 결론을 얻을 수 있다.
지금까지 고생하면서 배워왔던 WAS와 접목시킨다면 이해가 쉬워진다.
스레드풀은 쉽게말하면 Runnable 스레드들을 executorService를 통해 별도의 작업공간을 할당하여 스레드그룹만으로는 비효율적일 수 있는 병렬처리를 더 효율적으로 처리할 수 있도록 도와준다.
스레드풀의 강력한 이점은 블로킹 방식, 즉 다른 스레드가 작업을 완료할때까지 블로킹을 할 수 있다는 점이고 이를 위해 스레드 작업 완료 시점을 알 수 있도록 마치 작업관리자와 같은 환경을 구현할 수 있다.
스레드 풀은 작업 처리 시 사용하는 스레드의 수를 정해 넣고 작업 큐에 들어오는 작업(run())들을 하나씩 생성한 스레드에 맡아 처리하며, 작업 처리가 끝난 스레드는 다시 큐에서 작업을 가져와 처리한다.
스레드와 WAS를 연결하기 위한 글 - https://velog.io/@semi-cloud/Spring-%EC%84%9C%EB%B8%94%EB%A6%BF
스레드그룹과 스레드풀 - https://m.blog.naver.com/qkrghdud0/220693345433