Java中的守护程序线程
Java中的守护程序线程是在后台运行的线程,只要该程序在运行,它就可以执行该程序的某些任务。即使守护程序线程正在运行,也不会阻止JVM关闭。
Java守护程序线程的功能
1.当运行的所有线程都是守护程序线程时,Java虚拟机退出。因此,JVM仅等待程序中的非守护程序线程完成。
这就是Java中的守护程序线程适合执行一般任务(如清除内存中的缓存)的原因,这对于程序来说可能是必不可少的,但对于程序的主要部分却不是。甚至JVM在启动时也会创建用于垃圾回收和其他簿记任务的守护程序线程,以及用于执行程序的非守护程序主线程。这也是JVM不等待守护程序线程完成的原因,因为Java中的守护程序线程应该为用户线程执行一些后台任务。如果用户线程已完成,则执行守护程序线程没有任何意义。
2.一个线程是否是守护程序,该属性是否从产生另一个线程的线程继承。由于Java中的主线程是非守护程序,因此在主线程中产生的任何线程都是非守护程序。
3.以同样的方式,由守护程序线程创建的任何线程都会自动成为守护程序线程。
4.如果要将线程标记为守护程序线程或者用户线程,可以使用Java中Thread类的setDaemon(boolean on)方法完成此操作。只能在启动线程之前即在调用thread.start()方法之前调用此方法。否则抛出IllegalThreadStateException。
- Thread类的另一种方法是daDaemon()测试thread是否是守护线程。如果调用线程是守护程序线程,则返回true;否则,返回true。否则为假。
守护程序线程Java示例
在示例代码中,有两个线程类DaemonThread和AnotherDaemon。最初,当创建DaemonThread实例时,它将是非守护程序线程,因为它是在本身不是守护程序的主线程中创建的,后来使用setDaemon()方法将其更改为守护程序线程。另一方面,AnotherDaemon的实例将是一个守护程序线程,因为它是在DaemonThread中创建的,现在它是一个守护程序线程。
class DaemonThread extends Thread{
public void run() {
// Creating another thread from a demon thread
Thread ad = new AnotherDaemon();
System.out.println("DaemonThread daemon -- " + isDaemon());
System.out.println("AnotherDaemon daemon -- " + ad.isDaemon());
}
}
class AnotherDaemon extends Thread{
public void run() {
System.out.println("AnotherDaemon thread run() method");
}
}
public class TestThread {
public static void main(String[] args) {
Thread dt = new DaemonThread();
System.out.println("DaemonThread daemon -- " + dt.isDaemon());
// marking as daemon thread
dt.setDaemon(true);
dt.start();
try {
// delay to let the daemon thread execute,
// otherwise JVM exits after completing the
// execution of the main thread.
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
DaemonThread daemon -- false DaemonThread daemon -- true AnotherDaemon daemon -- true

