守护线程:完成系统性服务;
用户线程:完成业务操作;
一个Java应用内只有守护线程时,Java虚拟机会自动退出;
例子中,将线程设为守护线程,main方法执行2秒后执行结束,只剩下守护线程,程序退出,只打印2条记录;如果不设置守护线程,则无限打印下去,程序不会自动退出;
public class DaemonThreadDemo {
public static class DaemonDemo extends Thread {
@Override
public void run() {
while (true) {
System.out.println("I am alive.");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread t = new DaemonDemo();
t.setName("DaemonDemo");
t.setDaemon(true);
t.start();
TimeUnit.SECONDS.sleep(2);
}
}
如果设置守护线程,必须在启动线程(即调用start()方法)前设置,否则报错通知守护线程设置失败,但是程序可以正常执行,只是被当做用户线程执行而已;
守护线程设置失败错误:
Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.setDaemon(Thread.java:1359)
at DaemonThreadDemo.main(DaemonThreadDemo.java:25)