【问题标题】:Daemon Threads in java and its process spacejava中的守护线程及其进程空间
【发布时间】:2019-09-30 20:29:11
【问题描述】:

我编写了一个主应用程序,它创建了两个线程,即 A 和 B。线程 A 是用户线程,线程 B 是守护进程。 A 完成作业,因此 JVM 退出,但线程 B 仍在运行。由于线程 A 和 B 是在 JVM 空间中创建的,并且由于所有用户线程都已执行完毕,因此 JVM 已退出,那么线程 B 在哪里执行?它在哪个进程空间中执行?

【问题讨论】:

  • 线程 B 与 JVM 一起死掉,它不会继续运行。
  • 但我的假设是当所有用户线程完成执行时JVM退出。如果我错了,请纠正我。
  • 看到JVM已经退出,为什么会认为“线程B仍在运行”?
  • 我将它设计为可以运行一天以上..
  • JVM 在所有非守护线程都完成后终止。守护线程在那个时候被杀死,这就是守护线程的全部意义。如果您不希望这种情况发生,则需要至少保持一个非守护线程处于活动状态。

标签: java multithreading


【解决方案1】:

“守护程序”线程旨在在程序运行时在后台提供一般服务,但不是程序本质的一部分。因此,当所有非守护线程完成时,程序“突然”终止,杀死进程中的所有守护线程。

因此,一旦所有非守护程序退出,JVM 就会立即关闭所有守护程序,而无需您可能期望的任何形式(甚至最终都没有)。因为你不能以一种好的方式关闭守护进程,所以它们很少是一个好主意。

非守护进程执行器通常是更好的方法,因为执行器控制的所有任务都可以立即关闭。

现在来到您的特定场景。

A 完成工作,因此 JVM 退出,但线程 B 仍然存在 running- 这个假设是错误的 B 没有运行

线程 B 在哪里执行?它在哪个进程空间中执行?

B 将在 A 完成后“突然”终止,因此它 现在没有执行,因此没有进程空间问题。

【讨论】:

  • 我在一些博客中读到,一旦所有用户线程都成功完成,JVM 就会存在,而不会展开守护线程的堆栈。这是否意味着一旦所有用户线程完成,这些守护线程就会被杀死。
  • @wekselva 是的,因为通常我们将术语用户线程用于非守护线程。不确定为什么我的回答不清楚:)
  • 感谢Vipin的详细解释。很有用。
【解决方案2】:

守护线程用于后台任务,例如 GC 或自定义用例。 守护线程的目的是为用户线程提供服务,一旦没有用户线程运行并且程序退出,则不再使用守护线程

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多