💬 자바 쓰레드를 구현하는 2 가지 방법 (Runnable과 Thread)에 대해 알아보았습니다. 그리고 두 가지 방법 중 하나인 Runnable을 선택하여 멀티쓰레드를 구현하였습니다. 구현하면서 쓰레드 개수와 관련한 고찰을 함께 서술합니다.
참고사이트
implement
하거나 클래스를 extends
하는 방법이 있다. 전자가 Runnable
, 후자가 Thread
이다.Thread
의 API 문서를 확인하면 Thread
가 Runnable
인터페이스를 구현한 것을 확인할 수 있다.Thread
는 상속을 받아 사용하기 때문에 다른 클래스를 상속받을 수 없다는 단점이 있다.Runnable
은 인터페이스이기 때문에 다른 클래스를 상속받아야 할 경우나 재사용측면에서 효율적인 방법이다.
Thread
를 상속받지 않고Runnable
인터페이스를implements
하여 멀티쓰레드로 코드를 작성하였다.
Runnable
을 이용한 MultiThreads 구현Runnable
을 이용하여 Thread를 동작시켜보았다.main(...)
에서 Thread를 실행시키는 방법윈도우에서 작업 관리자를 실행했을 경우 대략적인 CPU 이용량만 파악할 수 있다.
💬 작성한 프로그램은 Jsoup 라이브러리를 이용하여 크롤링하는 프로그램입니다. 이 프로그램을 기준으로 마주한 문제에 대해 서술하도록 하겠습니다.
같은 서버에 똑같은 IP로 페이지 parameter만 다르게 하여 요청을 하는 것이기 때문에 서버 정책에서 IP 주소가 변하지 않고 수십, 수백 번의 요청 (쓰레드 개수만큼)이 온다면 사이트 정책 상 Blacklist로 관리되어 Block 당할 수 있다.
마주했던 에러:
SocketTimeoutException
, ```
단순히 CPU 이용률만을 근거로 쓰레드의 개수를 정하는 것만이 능사는 아니라는 것을 알았다.
또한, JVM에서 쓰레드를 운영하는 개수가 OS의 운영정책과는 별개이기 때문에, OS의 스케줄링 정책 등 고려해야할 요소가 많다.
▶ 쓰레드의 개수가 20개로 동작시켰을 때, IntelliJ의 CPU의 이용률이다.
▶ 쓰레드 개수가 20개로 동작시켰을 때, 전체 CPU의 이용률이다.
▶ 쓰레드의 개수가 20개로 동작시켰을 때, Heap의 사용정도이다. CPU 이용률은 낮지만, Heap의 사용정도는 상당하다.
▶ 메모리의 사용정도도 파악할 필요가 있다. 물론 다른 프로그램과 같이 운영되고 있어 메모리 사용률이 높을 수 있으나, 골자는 메모리의 사용정도도 쓰레드의 개수를 정하는 데 고려요소가 될 수 있다는 것이다.
😵 리소스를 할당하고 해제하는 데도 오버헤드가 있기 때문에 쓰레드 풀에 쓰레드를 미리 만들어 놓고 자원을 가져다 쓰고 다시 반납하는 방법도 고려요소가 될 수 있다고 생각했다.