【问题标题】:java daemon thread and non-daemon threadjava守护线程和非守护线程
【发布时间】:2013-10-21 22:09:00
【问题描述】:

我正在做java过去的试卷,我遇到了以下让我感到困惑的问题。

下列哪项是正确的? (选择所有适用的。)

A.当一个应用程序开始运行时,有一个守护线程,它的工作是执行 main()。

B.当一个应用程序开始运行时,有一个非守护线程,其工作是执行 main()。

C.由守护线程创建的线程最初也是守护线程。

D.由非守护线程创建的线程最初也是非守护线程。

关键答案是 B,C,D,谁能告诉我为什么 B,C 是正确的?非常感谢。

【问题讨论】:

  • 你一直在问这些问题。在问答案之前,你有什么可以先看的参考资料吗?你的笔记呢?
  • 有一些参考资料,但我仍然对此感到困惑:它指出:A 是错误的,因为 main() 是由非守护线程执行的。 B 是正确的,因为守护线程用于 JVM 的基础设施。非守护线程适用于程序员。 JVM 最初创建一个非守护线程来运行 main()。 C 和 D 都是正确的,因为线程的守护进程状态与其创建线程的状态相同。

标签: java multithreading daemon


【解决方案1】:

A.当一个应用程序开始运行时,有一个守护线程,它的工作是执行 main()。

这是不正确的。见下文。

B.当一个应用程序开始运行时,有一个非守护线程,其工作是执行 main()。

正确。 JVM 在最后一个非守护线程退出时退出。如果主线程不是非守护线程,那么 JVM 将启动并看到没有非守护线程在运行并立即关闭。

因此主线程必须是非守护线程。有关守护程序和非守护程序之间差异的描述,请参阅我的回答:Difference between a daemon thread and a low priority thread

C.由守护线程创建的线程最初也是守护线程。

D.由非守护线程创建的线程最初也是非守护线程。

两者都是正确的。线程从默认情况下生成它的线程获取其守护程序状态。守护线程产生其他守护线程。非守护线程产生其他非守护线程。查看来自Thread.init()的代码:

Thread parent = currentThread();
...
this.daemon = parent.isDaemon();

如果你想改变守护进程的状态,那么你必须在线程启动之前这样做。

Thread thread = new Thread(...);
// thread has the daemon status of the current thread
// so we have to override it if we want to change that
thread.setDaemon(true);
// we need to set the daemon status _before_ the thread starts
thread.start();

【讨论】:

  • 请问这两者有什么区别?谢谢格雷!
  • 在哪两个@bean 之间?
  • 守护线程和非守护线程的区别,抱歉,在问你之前我应该​​先google一下。非常感谢@Gray
  • 我添加了一个指向上一个答案@bean 的链接。 *.com/questions/10298306/…
【解决方案2】:

来自Thread documentation

由守护线程创建的线程最初也是守护线程

每个线程可能会也可能不会被标记为守护进程。当在某个线程中运行的代码创建一个新的 Thread 对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时,它才是守护线程。

当应用程序开始运行时,有一个非守护线程,其工作是执行 main()。

Java Virtual Machine starts up, there is usually a single non-daemon thread(通常是某个指定类的calls the method named main)时。 Java 虚拟机继续执行线程,直到发生以下任一情况:

  • Runtime 类的退出方法已被调用,安全性 经理已允许执行退出操作。

  • 所有不是守护线程的线程都已经死亡,要么 从调用 run 方法或通过抛出异常返回 传播到 run 方法之外。

守护线程和非守护线程

“守护”线程是指只要程序正在运行,它就应该在后台提供一般服务,但它不是程序本质的一部分。因此,当所有非守护线程完成时,程序终止。相反,如果有任何非守护线程仍在运行,则程序不会终止。

更多解释请参考ThinkingInJava

【讨论】:

    【解决方案3】:

    守护进程线程是那些不会阻止 JVM 退出的线程。 例如。垃圾回收是一个守护线程。

    非守护进程线程类似于主线程,在其退出时 JVM 也退出,即程序也结束。

    默认情况下所有线程都是非守护进程。

    【讨论】: