-
1. 개발을 하다가 아래와 같은 궁금증이 생겼다.
- CompletableFuture를 비동기 처리할 때는 ForkJoinPool의 스레드를 공유해서 사용한다는 특징이 있다. (물론, 스레드 미지정시 기본적으로 자바에서 제공해주는 ForkJoinPool을 사용)
- 그렇다면, 클라이언트에서 요청을 보냈을 때 할당해주는 스레드와 ForkjoinPool은 무엇이 다를까?
2. 기본적으로 클라이언트에서 요청을 보냈을 때, 톰캣에서 생성하는 스레드 풀이 할당된다.
- 아래의 그림과 같이 http-nio-8080-exec-4,5,main 라고 명시돼 있는 부분이 톰캣에서 생성하는 스레드 풀이다.
- 별도의 설정값 없이 실행을 하니, 10개의 스레드 풀이 생성된 것을 확인할 수 있고 설정된 값보다 더 많은 스레드가 필요시 되면, MAX 값 까지 실행이 된다.
jconsole을 이용한 모니터링 사진
- 요청을 마구잡이로 보내면 아래와 같이 더 많은 스레드가 생성된다.
- Stream의 parallel을 사용하면 아래의 그림과 같이 여러 스레드 자원을 할당하여 사용하기에 주의를 요해야 한다.
3. ForkJoinPool은 처음 실행시에 생성되진 않는다.
- 처음 서버를 가동한 다음에 생성된 스레드를 찾아보면 ForkJoinPool을 찾아볼 수 없다.
- 이는 해당 로직이 가장 처음 수행될 때 ForkJoinPool의 사용 가능한 Thread가 있는 지 확인해보고 없으면 생성하는 방식으로 사용된다.