Program Language/java

정확히 모르고 쓰면 사수한테 등짝 스매시 맞는 Thread, 당신도 모르는 사이 쓰고 있었다?

개발하는 주디씨 2023. 10. 17. 10:10

 

자바를 처음 공부하게 되면, 마지막 즈음에 배우게 되는 Thread라는 개념이 있다.

취업을 하고, 실무에서 spring, spring boot를 다루며 직접적으로 Thread라는 코드 본 것은 약,, 1-2번? 이었던 것이었다.

 

 

분명 자바 배울 때 배웠던 개념인데
실무에서는 별로 중요하지 않은것인가? 하는

-
이상한 호기심이 생겼다.

 

 

 

Thread? 그거 왜 씀?

자바에서 여러가지 일을 동시에 처리하기 위해 사용한다.

 

저는 멀티가 안되는 사람이라... 한 번에 한가지 일 밖에 못하지만,...

컴퓨터는 똑똑하니까 한 번에 여러가지 일을 하면 당연히 효율적이잖아요? ◠‿◠ 

 

 


들어가기 전에...

Thread를 알아보기 전에 꼭 알아야 더 잘 Thread를 이해할 수 있는 Process를 먼저 알고 갑시다.ᐟ.ᐟ 

 

 

프로세스

다들 컴퓨터하면서 작업관리자 열어서 왜 느린지 확인한 적 있나요?

 

프로세스란 바로 지금 이 컴퓨터 CPU에 올라가 있는(= 실행 중인 프로그램)을 말합니다.

 

컴퓨터는 각각 자신만의 메모리 공간을 포함한 독립적인 실행환경을 가지고 있습니다.

 

사람도 내 방 안에서 독립적으로 공간분리를 해서 사용하죠? 그거랑 똑같은 겁니다. 컴퓨터도 원룸에서 각각 공간마다 독립적으로 실행환경을 나눈다고 생각하면 👍🏻

Thread는 JVM(가상머신인데 모르면 이 정도는 찾아보기ෆ)에 의해 관리된다.ᐟ.ᐟ 

 

Thread란

  • 애플리케이션 코드를 하나씩 순차적으로 실행하는 것
  • 자바 어플리케이션 main()을 실행하게 되면 main()이 동작하는 것
  • Thread 없이는 자바 애플리케이션이 동작할 수 없음
  • Thread는 한 번에 하나의 코드라인만 수행할 수 있음

 

외워서 적었던 public static void main( )

 

실습을 하면서 이유도 모르고 그냥 외웠다..
main( )이 꼭 있어야 한다니까..그냥 그런 줄로만 이해했다...

 

 

 

자바 어플리케이션을 실행하면 main() 스레드가 자동으로 시작된다. 왜⸌◦̈⃝⸍ʷʰʸˀ̣ˀ̣ˀ̣ 그럴까..?

 

(Thread를 이해하기 위해 심플하게 생각하면)
프로세스에는 적어도 한 개 이상의 Thread가 존재해야 하기 때문이다.

 

 

자바는 일단, Main 스레드 하나로 시작하여 개발자가 스레드를 추가로 생성하게 되면 멀티 스레드 환경이 됩니다. 

 

 

이제 효율적으로 프로세스들을 처리하겠다 이말입니다~

 

그럼, Thread를 계속 만들어서 동시에 1000, 100000개가 돌아가게 하면 나는 꽤 기특한 개발자겠지? 🤔

 

 

바로 등짝 스매시 ◠‿◠ ;;...

 

Thread 등짝 스매시 안 맞는 법

  • 스레드는 프로세스의 리소스를 공유하기 때문에 효율적이지만, 잠재적인 문제점에 노출된다.
  • 스레드의 생성비용은 매우매우매우 비싸다.. 비싸다 Expensive..
  • 고객의 요청이 올 때마다 스레드가 생성된다면 response 응답 속도는 저하된다.
  • Context switching 비용도 발생된다.
  • 생성에 제한이 없다(......)
  • 고객의 요청이 너무 많으면 CPU나 메모리 임계점을 넘겨 서버가 죽을 수 있다😇

 

이 내용들을 반드시 알고 Thread를 써야 등짝 스매시를 피할 수 있다.

갑자기 이거보고 스레드 안 쓴다는 사람 있을까봐 장점도 소개하겠다.

 

그럼에도 불구하고 Thread를 사용하는 이유

  • 동시 요청을 처리할 수 있다.
    많은 사용자들이 같은 요청했는데 한 번에 한개만 처리하면 나머지는 계~~속 대기해야한다. 성질급한 한국사람은 절대 못기다린다.
  • 리소스가 허용하는 한 처리가 가능하다.
    우리에겐 CPU와 메모리가 있다. 이 엄청난 친구들이 허용하는 범위에서 처리할 수 있다는 건 굉장한 것이다.
  • 하나가 지연되어도 신에게는 아직 2개의 스레드가 남아있습니다😎
    작업 중 하나의 Thread가 지연된다면 나머지는 정상 동작한다. 따라서 영향을 안받으니까 내 할일을 잘 할 수 있다.
  • Thread Pool과 함께라면 오히려 좋아.
    내부에 Thread Pool을 두어 보관하고 관리하며, 무엇보다 총 생성 개수를 제한할 수 있다. 또한 대기, 거절을 통해 WAS의 부하를 줄일 수 있다.

 

실무에서 Thread Pool

WAS의 주요 튜닝 포인트, 최대 스레드 수

값을 낮게 설정했을때, 동시 요청이 많아진다면?

서버 리소스는 여유롭지만 클라이언트 응답에 지연이 발생 할 수 있다.

 

값을 높게 설정했을 때, 동시 요청이 많아진다면?

CPU, 메모리 리소스 임계점 초과로 서버가 다운된다.

 

Thread의 적당한 개수는 몇 갠가요?

  • 애플리케이션 로직의 복잡도, CPU, 메모리 리소스 상황 등 여러가지를 고려해야 한다.
  • 성능 테스트를 통해 확인해보세요.
  • 최대한 실제 서비스처럼 유사하게 고객의 요청도 많이보내고해서 테스트 해보세요.
  • 아파치 DB, 제이미터, nGrinder 사용하시면 됩니다.

 

 

끝.