我正在阅读java考试试卷,我遇到了令我困惑的以下问题。
以下哪项是真的? (选择所有适用的选项。)
一个。当应用程序开始运行时,有一个守护程序线程,其作用是执行main()。
B中。当应用程序开始运行时,有一个非守护程序线程,其作用是执行main()。
℃。守护程序线程创建的线程最初也是一个守护程序线程。
d。由非守护程序线程创建的线程最初也是非守护程序线程。
关键答案是B,C,D,谁能告诉我为什么B,C是正确的?非常感谢。
答案 0 :(得分:5)
一个。当应用程序开始运行时,有一个守护程序线程,其作用是执行main()。
这是不正确的。见下文。
B中。当应用程序开始运行时,有一个非守护程序线程,其作用是执行main()。
正确。当最后一个非守护程序线程退出时,JVM退出。如果主线程不是非守护进程,那么JVM将启动并看到没有非守护进程线程在运行并且会立即关闭。
因此,主线程必须是非守护进程线程。有关守护程序和非守护程序之间的差异的说明,请参阅我的答案:Difference between a daemon thread and a low priority thread℃。守护程序线程创建的线程最初也是一个守护程序线程。
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();
答案 1 :(得分:2)
每个线程可能也可能不会被标记为守护进程。当在某个线程中运行的代码创建一个新的Thread对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时才是守护进程线程。
当Java Virtual Machine starts up, there is usually a single non-daemon thread
(通常为calls the method named main
某个指定类时)。 Java虚拟机继续执行线程,直到发生以下任一情况:
已调用类Runtime的exit方法和安全性 经理允许退出操作。
所有非守护程序线程的线程都已死亡 从调用返回到run方法或抛出异常 传播超出run方法。
“守护程序”线程只要程序正在运行,就应该在后台提供一般服务,但不是程序本质的一部分。因此,当所有非守护程序线程完成时,程序终止。相反,如果有任何非守护程序线程仍在运行,程序不会终止。
有关更多解释,请参阅ThinkingInJava