문제
-
동시성 제어를 공부 하는 도중에 아래와 같은 코드를 보게 되었다.
ExecutorService executorService = Executors.newFixedThreadPool(32);
CountDownLatch countDownLatch = new CountDownLatch(threadCount);
-
해당 부분의 코드에 대해서 제대로 알 지 못하고 테스트를 진행하는 것은 제대로 된 공부가 되지 않는 것 같고, 쓰레드 풀에 왜 32가 들어가는지, 아예 모든 쓰레드를 넣으면 안되는지 궁금했다.
시도
- ExecutorService는 비동기로 실행하는 작업을 단순화하여 사용할 수 있게 도와주는 자바 API로 newFixedThreadPool을 사용하면 쓰레드 풀을 만들고 동시에 가동되는 쓰레드를 할당한다는 느낌이다.
- CountDownLatch는 다른 쓰레드에서 수행하는 작업이 끝날 때까지 대기하게 도와주는 클래스로, 다른 쓰레드의 작업이 완료되면 해당 객체의 countDown() 메서드를 통해 하나씩 내림으로써, 해당 객체가 종료되었음을 알린다.
- 그렇다면 쓰레드 풀에 몇 개까지 쓰레드를 할당해야 하는 것일까?
해결
- 적정 스레드 갯수 = 사용 가능한 코어 갯수 * (1 + 대기 시간 / 서비스 시간) 이라는 공식이 존재한다.
- 그리고 이를 각자 쓰레드 풀을 가지고 있다고 생각하여 계산한다면

이런 공식으로 사용된다고 한다.
- 공식에 대기시간까지 적용되는 이유는 I/O Bound 작업을 할 때를 고려해서 정한 것이라고 함.
참고 출처
https://code-lab1.tistory.com/269