자바 쓰레드 구현과 쓰레드 개수에 대한 고찰

Engineer Edlin·2022년 9월 21일
0
post-thumbnail

💬 자바 쓰레드를 구현하는 2 가지 방법 (Runnable과 Thread)에 대해 알아보았습니다. 그리고 두 가지 방법 중 하나인 Runnable을 선택하여 멀티쓰레드를 구현하였습니다. 구현하면서 쓰레드 개수와 관련한 고찰을 함께 서술합니다.

참고사이트

1. 자바 쓰레드를 구현하는 두 가지 방법

  • 자바 쓰레드는 OS의 쓰레드와 달리 JVM에 의해 스케줄링 된다.
  • 자바의 쓰레드 구현 방법에는 2 가지, 인터페이스를 implement하거나 클래스를 extends 하는 방법이 있다. 전자가 Runnable, 후자가 Thread 이다.
  • Thread의 API 문서를 확인하면 ThreadRunnable 인터페이스를 구현한 것을 확인할 수 있다.
  • Thread는 상속을 받아 사용하기 때문에 다른 클래스를 상속받을 수 없다는 단점이 있다.
  • Runnable은 인터페이스이기 때문에 다른 클래스를 상속받아야 할 경우나 재사용측면에서 효율적인 방법이다.

    Thread를 상속받지 않고 Runnable 인터페이스를 implements 하여 멀티쓰레드로 코드를 작성하였다.



2. Runnable을 이용한 MultiThreads 구현

  • Runnable 을 이용하여 Thread를 동작시켜보았다.
  • 두 가지 방법으로 Thread를 실행시킬 수 있다.
    • 방법 1: Thread를 실행시킨 뒤, 반환하는 방법

    • 방법 2: 실행시킬 작업을 반환하여 main(...)에서 Thread를 실행시키는 방법




3. 자바에서 쓰레드 개수에 대한 고찰

  • Single Thread일 때와, Multi Thread 일 때의 CPU 점유율 차이 등을 알아볼 수 있는 모니터링 도구가 있다.
  • VisualVM을 사용하였는데 윈도우의 경우 작업관리자에 들어가 확인이 가능하다. 그러나 VisualVM을 사용한 이유는 내가 현재 실행 중인 코드가 어느 정도의 CPU를 사용하는지에 관해 정확한 모니터링을 하고 싶었기 때문이다.

윈도우에서 작업 관리자를 실행했을 경우 대략적인 CPU 이용량만 파악할 수 있다.

💬 작성한 프로그램은 Jsoup 라이브러리를 이용하여 크롤링하는 프로그램입니다. 이 프로그램을 기준으로 마주한 문제에 대해 서술하도록 하겠습니다.



1) 동일한 사이트에 요청을 보내는가.

  • 여러 쓰레드로 크롤링을 한다고 가정할 때, 쓰레드마다 크롤링하는 사이트가 다른지 같은지에 따라 쓰레드의 개수가 달라질 수 있다.

    같은 서버에 똑같은 IP로 페이지 parameter만 다르게 하여 요청을 하는 것이기 때문에 서버 정책에서 IP 주소가 변하지 않고 수십, 수백 번의 요청 (쓰레드 개수만큼)이 온다면 사이트 정책 상 Blacklist로 관리되어 Block 당할 수 있다.

마주했던 에러: SocketTimeoutException, ```



2) 쓰레드로 수행하고자 하는 작업의 특성을 파악하자.

  • 단순 IO만 하는 작업의 경우 많은 쓰레드를 만들어 동시에 수행한다고 해서, CPU 이용률이 높아지지는 않았다.

    단순히 CPU 이용률만을 근거로 쓰레드의 개수를 정하는 것만이 능사는 아니라는 것을 알았다.
    또한, JVM에서 쓰레드를 운영하는 개수가 OS의 운영정책과는 별개이기 때문에, OS의 스케줄링 정책 등 고려해야할 요소가 많다.

  • CPU 이용률이 높지 않다고 해서 무작정 작업의 처리속도를 빠르게 하기 위해 쓰레드를 늘릴 수는 없다. 이는 프로그램을 실행시키면서 사용하는 Heap 사용정도나, OS에서 운영하는 쓰레드 수가 JVM에서 운영되는 쓰레드 수와 다르거나, 메모리의 사용정도가 다를 수 있기 때문이다.

▶ 쓰레드의 개수가 20개로 동작시켰을 때, IntelliJ의 CPU의 이용률이다.

▶ 쓰레드 개수가 20개로 동작시켰을 때, 전체 CPU의 이용률이다.

▶ 쓰레드의 개수가 20개로 동작시켰을 때, Heap의 사용정도이다. CPU 이용률은 낮지만, Heap의 사용정도는 상당하다.

▶ 메모리의 사용정도도 파악할 필요가 있다. 물론 다른 프로그램과 같이 운영되고 있어 메모리 사용률이 높을 수 있으나, 골자는 메모리의 사용정도도 쓰레드의 개수를 정하는 데 고려요소가 될 수 있다는 것이다.

😵 리소스를 할당하고 해제하는 데도 오버헤드가 있기 때문에 쓰레드 풀에 쓰레드를 미리 만들어 놓고 자원을 가져다 쓰고 다시 반납하는 방법도 고려요소가 될 수 있다고 생각했다.



3) 결론

  • 싱글 쓰레드보다는 분명 빠르지만, 무조건 멀티쓰레드로 프로그래밍하는 것이 능사는 아닌듯하다.
profile
담대하게 도전하고 기꺼이 실패를 받아들이는 개발자

0개의 댓글