Java如何处理退出时正在运行的线程?

4

我正在为学校编写一个简单的服务器-客户端程序。客户端发送命令和一些参数,服务器返回答案。

服务器将监听新连接,并为每个新客户端连接创建一个线程。服务器监听器也是一个独立的线程,由主函数启动。

服务器端的主函数等待用户输入,并在接收到适当的输入时退出。

目前,服务器监听器在循环中运行,其中包含以下内容:

while(true)
{
 ...
}

当主函数运行到程序结尾并退出时,它会杀死所有正在运行的线程吗?还是等待它们完成运行?

如果是后者,是否有一种方法可以调用它来返回系统正在尝试退出时返回 true 的值?

请记住,每个组件都是它自己的类的一部分。

1个回答

10

线程分为两种类型:守护线程用户线程。主线程始终是一个用户线程。

只要还有至少一个用户线程存在,进程就会保持活动状态。当所有用户线程终止时,所有守护线程都将被杀死,进程终止。

要设置线程的守护进程状态,可以在启动线程之前调用 setDaemon()

因此,当主线程到达程序末尾并退出时,它会杀死所有正在运行的线程吗?还是会等待它们运行完毕?

如果它是守护线程,则最终会被杀死。如果是用户线程,则进程将保持活动状态,直到该线程终止。


当所有非守护线程完成时,JVM 就会退出,这意味着所有守护线程都会自动停止。 - Maxim Shoustin
正巧我刚刚在答案中添加了类似的措辞。请查看更新。 - NPE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接