Java守护线程和非守护线程

11
我正在做Java过去的考试试卷,遇到了以下让我感到困惑的问题。
“以下哪些是正确的?(选择所有适用项。)”
A. 当一个应用程序开始运行时,有一个守护线程,其工作是执行main()。
B. 当一个应用程序开始运行时,有一个非守护线程,其工作是执行main()。
C. 由守护线程创建的线程最初也是守护线程。
D. 由非守护线程创建的线程最初也是非守护线程。
正确答案是B、C、D,请问为什么B、C是正确的呢?非常感谢。

4
你一直在问这些问题。在询问答案之前,你是否有可以参考的资料?你的笔记在哪里?请先查看相关资料和笔记再提问。 - Sotirios Delimanolis
有一些参考资料,但我仍然感到困惑:它指出:A是错误的,因为main()是由非守护线程执行的。B是正确的,因为守护线程是为JVM基础设施而设计的。非守护线程是为程序员而设计的。JVM最初创建一个非守护线程来运行main()。C和D都是正确的,因为线程的守护状态与其创建线程的状态相同。 - Huibin Zhang
可能是守护线程和低优先级线程之间的区别的重复问题。 - Raedwald
可能是https://dev59.com/j3E95IYBdhLWcg3wp_un的重复问题。 - Raedwald
1
@bean 请参考Java线程文档 - http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html - Prateek
3个回答

14

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

请问这两者有什么区别?谢谢,Gray! - Huibin Zhang
在哪两个 @bean 之间? - Gray
守护线程和非守护线程的区别,抱歉在问你之前我应该先谷歌一下。非常感谢@Gray。 - Huibin Zhang
我已经在之前的回答@bean中添加了一个链接。https://dev59.com/TWPVa4cB1Zd3GeqP2BDb#10298353 - Gray

4
线程文档,由守护线程创建的线程最初也是守护线程。
每个线程可能标记为守护线程或非守护线程。当运行在某个线程中的代码创建一个新的线程对象时,新线程的优先级最初设置为创建线程的优先级,并且仅当创建线程是守护线程时,新线程才是守护线程。
当应用程序开始运行时,有一个非守护线程,其工作是执行main()。
在Java虚拟机启动时,通常有一个单独的非守护线程(通常调用某个指定类的名为main的方法)。Java虚拟机继续执行线程,直到发生以下情况之一:
- 类Runtime的exit方法已被调用并且安全管理器已允许进行退出操作。 - 所有不是守护线程的线程均已停止,要么通过从run方法返回,要么通过抛出超出run方法的异常。
守护线程和非守护线程
“守护”线程是指在程序运行期间应该提供后台一般服务但不是程序本质部分的线程。因此,当所有非守护线程完成时,程序将终止。反之,如果有任何非守护线程仍在运行,则程序不会终止。
详细说明请参考ThinkingInJava

0

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

非守护线程是像主线程这样的线程,在其退出时JVM也会退出,即程序也会结束。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接