人所看到的都是前台线程,当通过Thread类的setDaemon方法将某个线程标记为后台线程后,它就具备了特殊的含义。后台线程的特点是当前台开启后,共同抢夺cpu执行权,当所有前台线程结束后,后台线程会自动结束,后台依赖于前台:前台在,后台就在,前台结束,后台结束。
public class StopThread implements Runnable {
private boolean flag=true;
public synchronized void run() {
while(flag) {
System.out.println(Thread.currentThread().getName()+"-----run");
}
}
public void changeFlag() {
flag=false;
}
}
public class StopThradDemo {
public static void main(String[] args) {
StopThread s=new StopThread();
Thread t1=new Thread(s);
Thread t2=new Thread(s);
t1.steDaemon(true);
t2.steDaemon(true);
t1.start();
t2.start();
int num=0;
while(true) {
if(num++ ==10)
{
break;
}
System.out.println(Thread.currentThread().getName()+"-----"+num);
}
}
}
自定义的两个线程,仍然能够结束。原因是:现在有三个线程main,t1,t2。将t1,t2标记为后台线程,当前台main结束后,后台线程自动结束了,即所有线程结束。
setDeamon方法必须在开启前调用。
当所有的守护线程结束后,jvn退出。
一个应用简介:有个输入线程和输出线程,当输入线程结束输入时,输出线程也就没存在的意义了,设为后台,自动结束。