10

I am doing java past exam paper, and I have encounter the following question that is confusing me.

Which of the following are true? (Choose all that apply.)

A. When an application begins running, there is one daemon thread, whose job is to execute main().

B. When an application begins running, there is one non-daemon thread, whose job is to execute main().

C. A thread created by a daemon thread is initially also a daemon thread.

D. A thread created by a non-daemon thread is initially also a non-daemon thread.

The key answer is B,C,D, could anyone tell me why B,C is correct? Many thanks.

4

3 回答 3

12

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();
于 2013-10-21T22:11:45.480 回答
4

线程文档

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

每个线程可能会也可能不会被标记为守护进程。当在某个线程中运行的代码创建一个新的 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

于 2013-10-22T12:08:50.480 回答
0

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

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

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

于 2019-03-13T05:57:08.753 回答