java中的用户线程和守护线程有啥区别? [复制]
Posted
技术标签:
【中文标题】java中的用户线程和守护线程有啥区别? [复制]【英文标题】:What's the difference between user thread and daemon thread in java? [duplicate]java中的用户线程和守护线程有什么区别? [复制] 【发布时间】:2012-12-25 17:19:03 【问题描述】:可能重复:What is Daemon thread in javaWhen are daemon threads useful?
我对 Java 中用户线程和守护线程之间的区别感到困惑。
你能告诉我吗:
-
Java 中的用户线程和守护线程有什么区别?
在什么情况下会使用守护线程?你能举几个例子吗?
【问题讨论】:
守护线程:***.com/questions/2213340/… 谢谢,但你能回答问题 2 吗? 希望我已经回答了你的第二个问题.. 这只是一个线程上的一个标志,上面写着,不要为了我而继续运行。您将使用这样的线程进行监控,例如检查其他线程是否被阻塞。如果没有其他线程在运行,那么做这个检查是没有意义的。 【参考方案1】:一旦最后一个非 jvm 线程终止,JVM 就会退出。这意味着如果您创建的任何线程仍在运行,jvm 将不会关闭。 守护线程是不会阻止 JVM 关闭的线程。通常,您会将它们用于一些后台任务,如果用户要求关闭应用程序,您不希望这些任务保持运行。
另外,您的问题已经在这里被问到(并得到了回答)-What is Daemon thread in Java?
守护线程的一些常见(根据个人经验)用例可能包括
后台线程轮询远程系统的状态变化 后台工作线程(例如发送电子邮件通知、snmp 等) 用于执行计划维护的自定义计时器线程【讨论】:
谢谢,但您的主要问题是问题 2 @lichengwu - 编辑回复以包含我使用的内容【参考方案2】:第二个问题:
当所有正常线程都已终止时,守护程序线程会自动终止。
您可以使用守护线程在您的应用程序中进行一些内务管理或清理。守护线程用于后台支持任务,仅在正常线程执行时才需要。 GC 线程是一个守护线程。
【讨论】:
为什么我的程序在 GC 发生时停止,为什么系统告诉 GC 仅在内存不足时发生? 这是一个单独的 SO 候选问题。任何方式来回答你的问题。 GC 浏览所有活动对象,因此通常在 GC 运行时暂停应用程序执行,以确保它能够以一致的状态查找对象。如果应用程序与 GC 一起运行,则对象可能处于不一致状态。是的,通常 GC 发生在 JVM 认为它需要更多可用内存时。 所以当 GC 开始运行时应用程序线程进入睡眠模式。 当你的 GC 线程只有在其他人休眠时才处于活动状态,这意味着你不需要 GC 线程。这根本不是多线程。 并发运行进程需要线程。我的意思是 GC 是一个糟糕的守护进程示例。你可以优化一下。 不同意你的评论。也许你可以问一个单独的问题。【参考方案3】:用户线程是由应用程序(用户)创建的线程,并且在大多数情况下,Java VM 创建一个守护线程来为用户线程提供服务。当用户线程退出时,VM 会区分线程是用户还是守护程序。如果用户线程退出,VM 将检查是否有任何其他用户线程正在运行。如果有,它将安排下一个线程(用户或守护进程)。如果没有其他用户线程在运行,而只有守护线程,则该 VM 实例也将退出。
这两种线程的区别很简单:如果 Java 运行时确定应用程序中运行的唯一线程是守护线程(即不存在用户线程),Java 运行时会立即关闭应用程序,有效地阻止所有死在其轨道上的守护线程。为了让应用程序继续运行,它必须始终具有至少一个活动用户线程。在所有其他方面,Java 运行时以完全相同的方式处理守护线程和用户线程。
【讨论】:
调用System.exit(0)
时主线程和用户线程都会停止,但是JVM会如何处理守护线程呢?忽视?停止?还是杀了?
@lichengwu - system.exit() 将阻止一切正常进行。不同之处在于更优雅的退出 - 就像你的 main() 方法结束时发生的那样。
@radai +1。 JVM退出时会先停止用户线程再停止守护线程吗?
@lichengwu - 我不认为他们对订单做出任何保证。如果您打算编写自己的关闭逻辑,请在正确关闭所有内容之前不要使用 System.exit()
@radai 好吧,jvm stop 不仅包括 system.exit。你知道jvm在关闭JVM时会按顺序停止用户线程和守护线程吗?以上是关于java中的用户线程和守护线程有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章