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