Java中的守护程序线程

时间:2020-01-09 10:35:05  来源:igfitidea点击:

Java中的守护程序线程是在后台运行的线程,只要该程序在运行,它就可以执行该程序的某些任务。即使守护程序线程正在运行,也不会阻止JVM关闭。

Java守护程序线程的功能

1.当运行的所有线程都是守护程序线程时,Java虚拟机退出。因此,JVM仅等待程序中的非守护程序线程完成。

这就是Java中的守护程序线程适合执行一般任务(如清除内存中的缓存)的原因,这对于程序来说可能是必不可少的,但对于程序的主要部分却不是。甚至JVM在启动时也会创建用于垃圾回收和其他簿记任务的守护程序线程,以及用于执行程序的非守护程序主线程。这也是JVM不等待守护程序线程完成的原因,因为Java中的守护程序线程应该为用户线程执行一些后台任务。如果用户线程已完成,则执行守护程序线程没有任何意义。

2.一个线程是否是守护程序,该属性是否从产生另一个线程的线程继承。由于Java中的主线程是非守护程序,因此在主线程中产生的任何线程都是非守护程序。

3.以同样的方式,由守护程序线程创建的任何线程都会自动成为守护程序线程。

4.如果要将线程标记为守护程序线程或者用户线程,可以使用Java中Thread类的setDaemon(boolean on)方法完成此操作。只能在启动线程之前即在调用thread.start()方法之前调用此方法。否则抛出IllegalThreadStateException。

  1. 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