繁体   English   中英

java守护程序线程和非守护程序线程

[英]java daemon thread and non-daemon thread

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

以下哪项是真的? (选择所有适用的选项。)

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

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

C.守护程序线程创建的线程最初也是一个守护程序线程。

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

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

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

这是不正确的。 见下文。

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

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

因此,主线程必须是非守护程序线程。 有关守护程序和非守护程序之间的不同的描述,请参阅我的答案: 守护程序线程和低优先级线程之间的区别

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();

来自Thread文档

守护程序线程创建的线程最初也是一个守护程序线程

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

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

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

  • 已调用类Runtime的exit方法,并且安全管理器已允许执行退出操作。

  • 所有非守护程序线程的线程都已死亡,无论是通过从run方法调用返回还是抛出传播超出run方法的异常。

守护进程和非守护进程线程

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

有关更多解释,请参阅ThinkingInJava

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

非守护进程线程就像主线程一样,JVM也退出,即程序也完成。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM