定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为守护线程的方式是在 线程对象创建 之前 用线程对象的setDaemon方法。
example: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。那Java的守护线程是什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则JVM不会退出。
例子程序:
thread = new Thread(this);
thread.setDaemon(true);
thread.start();
当java虚拟机中没有非守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底 会出现什么问题。
import java.io.IOException;
/*
* 守护线程在没有用户线程可服务时自动离开
* 在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。
* 这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。
* 将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。
* 典型的守护线程例子是JVM中的系统资源自动回收线程,
* 我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,
* 当我们的程序中不再有任何运行中的Thread,
* 程序就不会再产生垃圾,垃圾回收器也就无事可做,
* 所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。
* 它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
* 守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
* 也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。
* 那Java的守护线程是什么样子的呢。
* 当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;
* 如果还有一个或以上的非守护线程则JVM不会退出。
*/
public class ThreadDemo extends Thread {
public ThreadDemo() {
super("zhuyong");
}
/** *//**
* 线程的run方法,它将和其他线程同时运行
*/
public void run(){
for(int i = 1; i <= 40; i++){
try{
Thread.sleep(100);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println("TestThread: "+Thread.currentThread().getName() +i);
}
}
public static void main(String [] args){
ThreadDemo test = new ThreadDemo();
test.setDaemon(true);
test.start();
System.out.println("isDaemon = " + test.isDaemon());
try {
System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
分享到:
相关推荐
- **语法**:`thread.setDaemon(True)`或`thread.setDaemon(False)` - **参数**:`True`表示该线程为后台线程;`False`(默认值)表示该线程为前台线程。 #### 四、前后台线程的区别 1. **前台线程**(非守护线程...
本文将深入探讨`Thread`类的一些关键函数和方法,包括线程名称、`join`方法以及`setDaemon`方法,帮助开发者更好地理解和运用Python的多线程。 ### 线程名称 线程名称是一个方便识别线程身份的标识。默认情况下,...
t1.setDaemon(True) t1.start() print("I am the father thread.") ``` 在这个示例中,子线程`t1`被设置为守护线程,因此当主线程打印完"I am the father thread."后,不管`t1`是否完成,主线程都会退出,导致子...
设置线程为守护线程的方法是`setDaemon(true)`,必须在`start()`方法前调用。 - **join()**:此方法用于等待特定线程结束。调用`join()`后,当前线程会等待该线程执行完毕后再继续执行。 在示例`TestThread1`中,`...
`setDaemon(true)`方法可以将线程设置为守护线程。 8. **线程池** - Java提供`ExecutorService`和`ThreadPoolExecutor`来管理线程池,可以有效地复用线程,减少创建和销毁线程的开销,提高系统效率。 9. **异常...
可以通过`setDaemon(true)`方法将线程设置为守护线程。 总结: 理解并熟练掌握Thread类的构造器和方法,以及线程优先级的概念,对于编写高效、稳定的多线程程序至关重要。在实际开发中,应避免使用已过时的方法,...
通过setDaemon(true)方法将线程设置为守护线程。 7. **死锁(Deadlock)** 当两个或更多线程互相等待对方释放资源时发生死锁。避免死锁的关键在于遵循死锁预防的四个条件:互斥、请求与保持、不可剥夺和循环等待。...
通过调用setDaemon(true)方法可将线程设置为守护线程。 六、线程中断 1. interrupt()方法:用于中断线程,设置线程的中断标志。 2. isInterrupted()和interrupted()方法:检查线程是否已被中断,前者不会清除中断...
设置线程为守护线程可以通过调用`setDaemon(true)`方法实现,通常在`Thread`对象创建后、`start()`方法调用前设置。 总结一下,Java中的线程创建主要包括: 1. 继承`Thread`类:重写`run()`方法,通过`start()`启动...
t setDaemon true ; t start ; } HTTPSession内保存了Socket的引用 ">anoHTTPD是个很简单的http服务器 简单到只有一个java文件 主要原理是用ServerSocket接受请求 对每一个请求的Socket创建一个线程去处理...
要将线程设置为后台线程,可以调用`setDaemon(true)`方法,如下所示: ```java Thread thread = new Thread(new Task()); thread.setDaemon(true); // 设置为守护线程 thread.start(); ``` 后台线程的特点是,如果...
t.setDaemon(true); t.start(); } } class TestThread extends Thread { public void run() { while(true) { System.out.println("TestThread: "+Thread.currentThread().getName() + " is running"); } } ...
Thread.setDaemon()必须在 Thread.start()之前调用,否则运行时会抛出异常。 两者的区别: 唯一的区别是判断虚拟机(JVM)何时离开,Daemon 是为其他线程提供服务,如果全 部的 User Thread 已经撤离,Daemon 没有可...
这里的关键点在于`setDaemon(true)`方法,它将新创建的线程设置为守护线程。需要注意的是,线程必须在启动前设置为守护线程,一旦启动后就不能再更改其属性了。 #### 二、同步锁Synchronized `Synchronized`是Java...
- **守护线程**:通过`setDaemon(true)`方法将线程标记为守护线程,当所有非守护线程结束后,守护线程也将结束。 5. **线程安全**: - **volatile**关键字:保证了多线程环境下变量的可见性和有序性,但不保证...
默认情况下,用户创建的线程都不是守护线程,可以通过`setDaemon(true)`将其设置为守护线程。 7. **线程池** - **ExecutorService**:Java 5引入的并发工具,通过ThreadPoolExecutor实现线程池,可以管理线程的...
例如,可以使用`setDaemon(True)`将线程标记为守护线程,这意味着当所有非守护线程结束时,该线程也会被终止。另外,`isAlive()`方法可以用来检查线程是否正在运行。 #### 线程同步与锁 在多线程编程中,为了避免...
可以通过`setDaemon(true)`设置线程为守护线程。 通过深入理解并熟练运用上述线程相关知识,可以编写出更加高效、安全的多线程Java程序。在实际项目中,合理地使用线程技术,可以显著提升程序的并发能力,提高系统...