"여기 새롭고 흥미로운 주제가 있습니다."

"다른 모드에서 스레드를 시작할 수 있다는 것이 밝혀졌습니다."

"하나의 스레드만 있는 표준 프로그램은 기본 스레드가 작업을 마치면 실행을 중지합니다. 기본 스레드가 실행을 마치고 프로그램이 종료되고 JVM이 메모리를 해제합니다."

"자식 스레드를 시작하면 기본 스레드가 종료되더라도 프로그램이 계속 실행됩니다. 실행 중인 스레드가 하나 이상 있는 한 JVM은 종료되지 않습니다. 실행 중인 스레드가 모두 완료되면 프로그램이 닫힙니다."

"대형 프로그램에는 프로그램의 다른 부분에 서비스를 제공하는 소위 '서비스 스레드'가 있는 경우가 많습니다. 자체적으로는 필요하지 않습니다. 예를 들어 사용하지 않는 개체 제거(가비지 수집), 메모리 덤프 및 오류 로깅, 현재 프로그램 상태에 대한 다양한 보고서 등."

"이러한 서비스 스레드는 프로그램이 실행될 때 필요하지만 자체적으로는 필요하지 않습니다."

"예, 이해합니다."

"Java를 사용하면 스레드를 데몬으로 실행할 수 있습니다 . 이러한 스레드는 다른 스레드와 동일하게 작동하지만 프로그램의 데몬이 아닌 스레드가 모두 종료되고 데몬 스레드만 남아 있으면 JVM이 프로그램을 닫습니다."

"그래서 '서비스' 스레드를 선언하는 것은 프로그램이 종료될 때 고려되지 않는다는 것을 의미합니다. 그게 전부인가요?"

"으으으음... 음, 짧고 상냥하게 말씀하셨군요. 본질적으로 제가 말씀드리고 싶었던 것이 바로 그것입니다."

"간결함은 재능입니다. 그리고 재능 있는 로봇은 모든 것에 재능이 있습니다."

"질문 있나요?"

"데몬으로 스레드를 어떻게 시작합니까? 일부 DaemonThread 클래스에서 상속합니까?"

"아니요, 그것보다 훨씬 간단합니다. Thread 클래스에는 setDaemon(boolean) 메서드가 있습니다. true만 전달하면 됩니다. start() 메서드를 호출하기 전에 호출하기만 하면 됩니다. 실제 스레드가 실행되기 전에 스레드가 실행되기 시작한 후에는 스레드 유형을 변경할 수 없습니다."

예:
Thread thread = new LoggerThread();
thread.setDaemon(true);
thread.start();

"그리고 그게 다야?"

"예."

"스레드를 만들고 시작하는 과정에 대해 다시 한 번 여러분의 관심을 환기시키고 싶습니다."

"Thread 객체를 생성한다고 해서 스레드가 생성되는 것은 아닙니다. Thread 객체는 스레드가 아닙니다. JVM은 start() 메서드가 호출될 때 스레드를 생성합니다. Thread는 스레드에 대한 정보에 액세스하고 당신이 그것에 대해 약간의 통제."

"그렇구나. 고마워, 엘리."