생성한 워커 스레드에 작업을 지시하고 호출 스레드는 그 결과를 기다리지 않고 종료하는 로직이 있었다.
대략적인 구조는 아래와 같았다.
Thread thread = new Thread(runnable);
thread.start();
return;
여기서 요구 사항이 추가되어, 호출 스레드가 하나의 워커 스레드의 작업 결과를 기다렸다가 반환하는 기능이 추가되어야 했다.
Thread thread = new Thread(runnable);
thread.start();
thread.join();
return;
이렇게 로직을 짰는데, 몇 초 뒤 이런 생각이 났다.
어? 뭐여? 어차피 호출 스레드는 worker 작업이 끝날 때까지 블로킹되는데, 굳이 스레드를 만들 필요가 있나?
이렇게 해도 되잖아?
runnable.run();
return;
그리고 난 궁금해졌다.
이렇게 의미 없이 대기하는 스레드는 '정확히 어떤' 악영향을 미칠까?
처음엔 '대기 중인 스레드 또한 운영체제 스케줄러에게 작업 시간을 할당받고, 해당 시간 동안 아무것도 하지 않는 건가?'
하는 생각이 들었다.
하지만 AI 선생님은 아니라고 한다. 스레드의 상태 자체가 대기 중이라서 스케줄링 큐에서 작업 대상이 되진 않는다고 한다.
그럼 불필요하게 스레드를 생성해서 대기시키는 경우, 무엇이 문제일까?
내 기본 지식, 널널한개발자 아저씨의 강의, AI님의 지혜를 통합해서 보면
- Thread 객체의 힙 메모리 공간 낭비 + Thread 객체 생성 자체가 커널 호출 등 비용이 큼
- 생성한 스레드만큼, 개별 스레드 전용 공간인 Stack, PC Register 공간 낭비 + 공간 할당과 초기화 리소스
- 운영체제의 스케줄링 부하
이 정도가 있겠다. 시간 낭비의 불이익도 있지만, 자원 낭비 측면도 만만치 않은 것이다.
나머지는 자바를 좀 더 깊게 공부하면서 알아가는 재미도 있을 것 같아 기대된다.
스레드와 스케줄링에 대해 더 공부하다 보면 추가적인 문제점도 발견할 수 있지 않을까?
회사 코드에서 동기화, 멀티스레드, 자바 네트워크 or File I/O 등
그동안 자주 접하지 않았던 자바 고급 주제를 자주 접하고 있다.
이렇게 된 거 자바 언어와 이를 둘러싼 개념에 대해 한번 깊이 파고들어야겠다.
책으로는 모던 자바 인 액션 / 이펙티브 자바를, 강의로는 김영한 쓰앵님의 자바 고급 강의를 들으려 한다.
모던 자바 인 액션은 거의 읽어가고, 강의는 이제 시작하는 입장인데
김영한 선생님 강의가 고급 주제를 다루더라도 기초부터 차근차근 짚어주는 느낌이 강해서
강의를 먼저 듣고 책을 보는 것이 좋을 것 같다.
안 그래도 모던 자바 인 액션은 뒷부분이 좀 어려운 느낌이 있어서
김영한 에너지를 받고 오면 좀 낫지 않을까 싶다.
'TIL' 카테고리의 다른 글
사람을 낚는 AI (0) | 2025.03.03 |
---|---|
CI/CD에서 Runner란? (0) | 2025.02.18 |
gitlab과 SSH - private key를 왜 못 찾니 (0) | 2025.02.18 |