「新しくて興味深いトピックがあります。」

「さまざまなモードでスレッドを開始できることがわかりました。」

「標準プログラム (スレッドが 1 つだけ) は、メイン スレッドが作業を終了すると実行を停止します。メイン スレッドが実行を終了し、プログラムが終了し、JVM がメモリを解放します。」

「子スレッドを起動すると、メインスレッドが終了してもプログラムは実行され続けます。実行中のスレッドが少なくとも 1 つある限り、JVM は終了しません。実行中のスレッドがすべて終了すると、プログラムは終了します。」

「そうですね、大きなプログラムには、プログラムの他の部分にサービスを提供する、いわゆる「サービス スレッド」が存在することがよくあります。それら自体は必要ありません。例: 未使用のオブジェクト (ガベージ コレクション)、メモリ ダンプ、エラーの削除ログ記録、現在のプログラムのステータスに関するさまざまなレポートなど。

「これらのサービス スレッドはプログラムの実行時に必要ですが、それ自体は必要ありません。」

「はい、それは分かりました。」

「Java では、スレッドをデーモンとして実行できます。そのようなスレッドは他のスレッドと同じように機能しますが、プログラム内のすべての非デーモン スレッドが終了し、デーモン スレッドだけが残った場合、JVM はプログラムを閉じます。」

「つまり、『サービス』スレッドを宣言するということは、プログラムが終了するときにそれが考慮されないことを意味するだけです。それだけですか?」

「うーん...そう、あなたは確かに短くて優しい言葉を言いましたね。要するに、それが私があなたに伝えたかったことです。」

「簡潔さは才能です。そして才能のあるロボットはあらゆる点で才能があります。」

"質問は?"

「デーモンとしてスレッドを開始するにはどうすればよいですか? DaemonThread クラスから継承しますか?」

「いいえ、それよりもずっと簡単です。Thread クラスには setDaemon(boolean) メソッドがあります。true を渡すだけで十分です。start() メソッドを呼び出す前に、実際のスレッドが実行される前に、このメソッドを呼び出す必要があるだけです。作成されました。スレッドの実行開始後にスレッドのタイプを変更することはできません。」

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

"以上です?"

"はい。"

「スレッドの作成と開始のプロセスにもう一度注目していただきたいと思います。」

「Thread オブジェクトを作成しても、スレッドは作成されません。Thread オブジェクトはスレッドではありません。start() メソッドが呼び出されたときに、JVM はスレッドを作成します。Thread は、スレッドに関する情報にアクセスできるようにする特別な JVM オブジェクトであり、あなたはそれを少しコントロールできます。」

「そうですか。ありがとう、エリー」