해결된 질문
작성
·
35
0
- 학습 관련 질문을 남겨주세요. 질문을 상세히 작성하면 더 좋습니다.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
어렵게 느껴졌던 Structured Concurrency에 대해 강의를 듣고 많이 이해하고 배워 갑니다.
자바에서는 데몬이 아닌 자식 쓰레드가 끝나지 않으면 메인 쓰레드가 끝났더라도 JVM이 종료가 되지 않는 걸로 알고 있습니다. 따라서 아래 자바 코드는 th01을 join()으로 기다리지 않더라도 JVM은 끝나지 않습니다.
public class scratch02 {
public static void main(String[] args) throws Exception {
Thread th01 = new Thread(()-> {
while(true) {
System.out.println("I'm working");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
th01.start();
System.out.println("End of the main thread");
}
}
그런데 코루틴의 경우 Main Job과 별도의 Root Job으로 수행되는 코루틴의 경우에 아무리 동작 중이더라도 Main Job이 끝나 버리면 JVM이 종료 되어버리죠. 자바나 코틀린이나 같은 JVM에서 동작할 텐데 이런 차이는 왜 발생하는 걸까요?
즉, 같은 질문이긴 한데 코루틴은 어떻게 Main Thread가 종료 될 때 다른 코루틴이나 쓰레드의 종료를 기다리지 않고 JVM을 종료 할수 있게 되는 것인가요?
답변 2
1
mamu님 안녕하세요. 강의가 도움이 돼서 기쁘네요!
날카로운 질문 주신거 같아요. 분명 메인스레드에서의 동작이 남아있는데 종료되는 것이 이상하게 느껴지셨을 수 있습니다.
질문 주신 부분을 이해하시려면 코루틴의 내부 동작을 이해해야 합니다.
결국 코루틴은 내부적으로는 콜백을 사용해 비동기를 구현합니다. (Continuation을 기반으로 동작하게 돼 있습니다.) 따라서 메인 함수가 반환돼 버리면 콜백이 일어나지 못하고 종료되는 것입니다.
답변이 도움이 되었으면 좋겠습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. mamu님.
코루틴과 JVM의 종료 조건에 대한 질문을 주셨네요. 코루틴과 스레드의 동작 방식의 차이점을 이해하는 것이 중요한데, 이에 대해 간단히 설명해 드리겠습니다.
자바 스레드의 종료 조건:
코루틴의 종료 조건:
runBlocking
같은 경우는 블록 전체가 완료될 때까지 메인 스레드를 점유하며 작업을 완료하고, 메인 코루틴이 종료되면 루트 코루틴이 아닌 한 자식 코루틴들은 함께 종료되므로, JVM도 이를 따라 종료됩니다.SupervisorJob
이나 명시적으로 생성된 Job
으로 시작된 코루틴이라면 명시적으로 종료를 관리해야 JVM 종료를 제어할 수 있습니다.이 개념에 대해 좀 더 알고 싶으시다면 관련 코루틴 종료와 JVM 종료 관련 강좌를 참고해 보세요. 이는 코틀린이 자바와 다른 점을 이해하는 데 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
말씀해 주신 부분은 생각해 보니 Continuation 기반 동작이기 때문에 같은 메인 쓰레드내에서의 코루틴인 경우에는 이해가 될 것 같습니다. 하지만 다음처럼 디스패처를 사용해서 쓰레드를 분리하여 코루틴을 수행하는 경우에는 위의 자바 코드 예처럼 분명히 메인 쓰레드의 자식 쓰레드가 만들어 졌을 것인데 이 경우에도 메인 쓰레드가 자식 쓰레드를 기다리지 않고 종료되는 것도 Continuation 콜백 동작으로 설명이 되는 것인가요? 여기까지 생각해 보면 언뜻 이해가 잘 안가네요.