“这是一个有趣的新话题。”

“事实证明,你可以以不同的模式启动线程。”

“一个标准程序(只有一个线程)在主线程完成工作时停止运行。主线程完成执行,程序终止,JVM 释放内存。”

“如果我们启动一个子线程,即使主线程结束,程序也会继续运行。只要至少有一个正在运行的线程,JVM 就不会终止。一旦所有正在运行的线程都完成,程序就会关闭。”

“嗯,大型程序通常有所谓的‘服务线程’,它们的工作是为程序的其他部分提供服务。它们本身并不是必需的。例如:删除未使用的对象(垃圾收集)、内存转储和错误日志记录、关于当前程序状态的各种报告等等。”

“程序运行时需要这些服务线程,但它们自己不需要。”

“是的,我明白这一点。”

“Java 允许您将线程作为守护进程运行。此类线程的功能与其他线程相同,但如果程序中的所有非守护线程都已终止并且只剩下守护线程,则 JVM 将关闭该程序。”

“所以声明一个'服务'线程只是意味着程序终止时不考虑它。就这样吗?”

“嗯嗯……嗯,你说的真是简短而甜蜜。本质上,这就是我想告诉你的。”

“简洁是一种天赋。有天赋的机器人在任何方面都是有天赋的。”

“任何问题?”

“如何将线程作为守护进程启动?从某个 DaemonThread 类继承?”

“不,它比那简单得多。Thread 类有一个 setDaemon(boolean) 方法。你只需要传入 true 就可以了。你只需要在调用 start() 方法之前调用它,在真正的线程之前已创建。在线程开始运行后,您无法更改线程的类型。”

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

“就这样吗?”

“是的。”

“我想再次提请您注意创建和启动线程的过程。”

“创建 Thread 对象不会创建线程。Thread 对象不是线程。JVM 在调用 start() 方法时创建线程。Thread 是一种特殊的 JVM 对象,它允许您访问有关线程的信息并提供你对它有一点控制权。”

“我明白了。谢谢,艾莉。”