Daemon线程,即后台线程或守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程。反过来说,只要任何非后台线程还在运行,程序就不会终止。--《Java编程思想》比如垃圾回收线程就是一个很称职的daemon线程。
Daemon线程的创建方式和普通线程差不多,只需通过setDaemon(true)将线程设置为daemon线程
下面是一个简单的例子程序:
public class Daemon implements Runnable{
public static int count = 0;
public final int id = count++;
public static void main(String[] args) {
for(int i=0 ; i<10 ; i++) {
Thread daemon = new Thread(new Daemon());
daemon.setDaemon(true); //将线程设为Daemon线程
daemon.start();
}
try {
System.out.println("all deamon started!");
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
while(true) {
Thread.sleep(100);
System.out.println("Daemon Thread "+id + " is running...");
}
} catch (InterruptedException e) {
// TODO: handle exception
}
}
}
运行结果:
all deamon started!
Daemon Thread 8 is running...
Daemon Thread 4 is running...
Daemon Thread 0 is running...
Daemon Thread 2 is running...
Daemon Thread 1 is running...
Daemon Thread 3 is running...
Daemon Thread 5 is running...
Daemon Thread 6 is running...
Daemon Thread 7 is running...
例子程序分析:
由于主线程执行完输出语句后睡眠了100ms,并没有结束线程,所以所有daemon线程都能创建并完成输出。假设我们把主线程的休眠时间改为99ms,观察输出情况。
all deamon started!
Daemon Thread 3 is running...
Daemon Thread 1 is running...
Daemon Thread 0 is running...
Daemon Thread 2 is running...
此时可以发现,因为主线程提前结束了,所以有一部分daemon线程没有来得及执行完所有操作就终止了。
通过上述例子,使用daemon线程需要注意以下几点:
①setDaemon(true)需要在start()之前,否则会报“IllegalThreadStateException”异常
②因为daemon线程随时可能被杀死,所以不要试图用它来访问固有资源(数据库等)