概述
java线程分为普通线程和守护线程,普通线程是运行在前端的线程,守护线程运行在后台的,守护线程主要是为其他线程提高一些服务,当所有非守护线程都结束之后,守护线程也会被虚拟机自动终止.
java中可以通过Thread的setDaemon(true)方法将一个线程设置为守护线程
守护线程必须在线程启动前设置,不然会抛出一个IllegalThreadStateException异常,这一点可以看下jdk中Thread线程的源码setDaemon就明白了
public final void setDaemon(boolean on) {
checkAccess();
// isAlive方法判断线程是否存活.在线程启动了还没有终止之前isAlive均返回true
if (isAlive()) {
throw new IllegalThreadStateException();
}
daemon = on;
}
代码样例
package thread.keyword;
import java.util.Date;
/**
* 普通线程
* @author Administrator
*
*/
class Consumer extends Thread{
private int no;
private int time;
public Consumer(int no, int time) {
this.no = no;
this.time = time;
}
public void run(){
System.out.println(no + "号桌的客人开始消费了");
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(no + "号桌的客人结束消费耗时:" + time);
}
}
/**
* 守护线程,线程设置为每秒报数
* @author Administrator
*
*/
class Waiter extends Thread{
public void run(){
try {
while(true){
System.out.println(new Date());
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* Daemon,将一个线程设置为守护线程,当一个进程中所有非守护线程都结束时,这个进程也将结束
* @author Administrator
*
*/
public class DaemonDemo {
public static void main(String[] args) {
Consumer c1 = new Consumer(1, 1000);
Consumer c2 = new Consumer(2, 2000);
Consumer c3 = new Consumer(3, 3000);
Waiter w1 = new Waiter();
// 此处表示将w1线程设置为守护线程,w1线程将在c1、c2、c3三个线程执行完成之后结束执行,
// setDaemon必须在线程启动之前设置
w1.setDaemon(true);
w1.start();
c1.start();
c2.start();
c3.start();
}
}
执行结果