`

我对守护线程(Daemon) 的理解

阅读更多
我对守护线程(Daemon) 的理解
Java有两种Thread:“守护线程Daemon”与“用户线程User”。
守护线程是一种“在后台提供通用性支持”的线程,它并不属于程序本体。
从字面上我们很容易将守护线程理解成是由虚拟机(virtual machine)在内部创建的,而用户线程则是自己所创建的。事实并不是这样,任何线程都可以是“守护线程Daemon”或“用户线程User”。他们在几乎每个方面都是相同的,唯一的区别是判断虚拟机何时离开:
用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。
守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。
setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,false为User模式。setDaemon(boolean on)方法必须在线程启动之前调用,当线程正在运行时调用会产生异常。isDaemon方法将测试该线程是否为守护线程。值得一提的是,当你在一个守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程同样。

看下面的程序
package thread;

import java.io.IOException;

public class TestMain4 extends Thread {

public TestMain4() {
}

/**
* 线程的run方法,它将和其他线程同时运行
*/
public void run() {
for (int i = 1; i <= 100; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println(i);
}
}

public static void main(String[] args) {
TestMain4 test = new TestMain4();
test.setDaemon(true);
test.start();
System.out.println("isDaemon = " + test.isDaemon());
try {
System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束
} catch (IOException ex) {
ex.printStackTrace();
}
}

}
在cmd下运行发现结果是这样的
D:\dionysus\common\DemoTest\build\classes>java thread.TestMain4
isDaemon = true
1
2
3
d4
5
6
d7
8
d9
10
d11
12
d13
d14
d15
16
17

D:\dionysus\common\DemoTest\build\classes>


其中的test被设置为守护线程
而main线程为用户线程。即等你输入后(如回车),用户线程就结束,它会检查是否还有其他用户线程在运行,如果没有则程序结束(不管有没有其他的守护线程在运行)

其他例子:
例:我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。


有一个问题:在守护线程中创建一个用户线程会怎么样呢?

新建一个线程类
package thread;

public class TestThread extends Thread {
public void run() {
for (int i = 1; i <= 100; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("守护执行线程"+i);
}

}
}

修改下TestMain4类

然后将以下这段代码插在TestMain4的run()方法的第一句
TestThread test1 = new TestThread();
test1.setDaemon(false);
test1.start();
运行后发现即使System.in.read(); 接受输入后,程序还是在运行
直到守护线程的运行结束,当然如果将这段代码放在run方法的for循环之后,接受输入后,程序立马停止(因为TestThread test1 = new TestThread();还没执行到这一步)


所以总结下:

在守护线程中创建非守护线程(前提是非守护线程执行语句要放在守护线程前),则不会因为其他所有非守护线程的结束而程序运行结束。总之一句话,如果当前还有一个非守护线程在执行,则程序不会结束(不管他是不是在守护线程中创建)。因为在守护线程中创建的默认都是守护线程,当然如果把守护线程创建的默认守护线程改成非守护线程,运行结果就不一样了。而在非守护线程中创建守护线程就很好理解了。


分享到:
评论

相关推荐

    java daemon 守护线程实例

    java daemon 程序,有助于理解守护线程的概念和使用

    线程守护程序

    在Java中,一个线程被标记为守护线程(Daemon Thread)后,它不会阻止Java虚拟机(JVM)的退出。正常情况下,JVM会在所有非守护线程结束后退出。但如果存在守护线程,即使没有其他非守护线程,JVM也会继续运行,直到...

    java 变形金刚中的守护神(守护线程)

    在Java编程语言中,守护线程(Daemon Thread)被称为“变形金刚中的守护神”,这是因为它们在后台默默地工作,为应用程序提供必要的服务,而不会阻止程序的退出。理解并正确使用守护线程是Java多线程编程中的一个...

    守护线程系统-含源码

    在Java编程中,守护线程(Daemon Thread)是一种特殊的线程类型,它的主要作用是为应用程序提供后台服务,而不会阻止程序的退出。当所有的非守护线程(用户线程)结束时,JVM会自动关闭守护线程并退出。在本项目...

    什么是java的守护线程.pdf

    Java中的守护线程(Daemon Thread)是Java虚拟机(JVM)的一种特殊线程类型,它们在后台执行任务,主要用于为应用程序的其他非守护线程提供服务。守护线程的一个典型例子是垃圾回收器(Garbage Collector),它默默...

    浅谈java中守护线程与用户线程

    浅谈java中守护线程与用户线程 本篇文章主要介绍了java中守护线程与用户线程的概念和区别。...本篇文章主要介绍了java中守护线程与用户线程的概念和区别,并通过例子来加深对守护线程和用户线程的理解。

    守护线程确保pushService

    在Android中,我们可以通过设置Thread的daemon属性将其转换为守护线程。 2. **保活策略**: - **双进程保活**:创建一个辅助进程,将关键服务运行在这个进程中。这样即使主进程被系统回收,辅助进程仍然可以存活,...

    JVM中的守护线程示例详解

    【守护线程详解】 在Java虚拟机(JVM)中...理解守护线程的工作原理对于优化Java应用性能和资源管理至关重要。正确使用守护线程可以提高程序的效率,避免不必要的资源消耗,同时确保程序能够及时响应用户的退出请求。

    多线程thread线程的理解

    10. **守护线程(Daemon Thread)**:守护线程在没有非守护线程运行时自动结束,常用于后台服务,如垃圾收集器。 通过学习和实践上述知识点,你将能够深入理解多线程编程,并能有效利用这一技术提高程序的性能和...

    守护进程(java)

    在这段代码中,`daemonThread`被设置为守护线程,当其他非守护线程结束时,JVM会继续运行该线程直到其完成任务。 守护线程通常用于执行一些后台任务,如资源清理、日志记录、定时任务等。由于它们在所有非守护线程...

    线程属性理解源码——属性、释放线程

    4. **守护线程**:守护线程(Daemon Thread)是一种特殊的线程,它们在所有非守护线程结束后依然运行。在Unix系统中,通过设置线程属性可以使线程变为守护线程。 在《ThreadsTerminate》这个项目中,作者可能通过源...

    java中守护进程小结

    Java中的守护线程(Daemon Threads)是用于支持应用程序运行的重要组件,它们在后台执行任务,不会阻止Java虚拟机(JVM)的退出。守护线程的主要任务是为其他非守护线程提供服务,例如垃圾回收线程就是典型的守护...

    Java多线程笔记

    Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,可以使用 ...

    Java并发编程示例(七):守护线程的创建和运行

    在Java编程中,守护线程(Daemon Thread)是一种特殊的线程类型,它的主要特点是当所有非守护线程(用户线程)结束时,守护线程也会随之终止,即使守护线程本身仍在运行。守护线程通常被用作后台服务,如垃圾回收、...

    java两个线程互相守护

    线程守护(Daemon)是一种特殊类型的线程,它的主要特点是当所有非守护线程结束时,程序会自动终止,即使还有守护线程在运行。通常,后台服务或者定时任务等不直接影响程序主要功能的线程会被设置为守护线程。 在...

    java 多线程的理解及其代码

    10. 守护线程(Daemon Thread): 守护线程主要用于为其他线程提供服务,如垃圾收集器。当所有非守护线程结束时,程序会退出,即使还有守护线程在运行。 通过深入理解和熟练运用这些知识点,开发者能够更好地在...

    java多线程Demo

    5. 守护线程(Daemon Thread): 守护线程是用于支持应用程序运行的后台线程,比如垃圾回收器就是守护线程。当所有非守护线程结束时,即使还有守护线程在运行,JVM也会退出。我们可以使用`setDaemon(true)`方法将...

    Java多线程机制(讲述java里面与多线程有关的函数)

    守护线程(Daemon)是一种不阻止程序退出的线程,如垃圾收集器就是守护线程。当所有非守护线程结束时,程序会终止,即使还有守护线程在运行。 掌握Java的多线程机制对于编写高效、并发友好的应用程序至关重要,它...

    多线程基础与基于多线程的简单聊天室

    8. **守护线程(Daemon Thread)**:守护线程是一种特殊的线程,当所有的非守护线程结束时,程序会自动退出,即使还有守护线程在运行。 9. **基于多线程的聊天室**:一个简单的聊天室程序通常由服务器端和客户端...

    Java语言多线程终止中的守护线程实例

    而守护线程通常用于后台服务,如垃圾回收、日志记录等,这些服务对程序的运行并非必不可少,因此,当所有用户线程都结束时,即使还有守护线程在运行,Java虚拟机(JVM)也会退出。 创建和设置守护线程的方法是通过`...

Global site tag (gtag.js) - Google Analytics