23-08-24 TIL

more·2023년 8월 24일
0

문제

  • 동시성 제어를 공부 하는 도중에 아래와 같은 코드를 보게 되었다.

    
    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

profile
조금 더

0개의 댓글