守护线程和其他的线程没什么特别的不同,它的不同之处就是守护线程是为用户线程服务的,且优先级比较低。在java中当应用只剩下守护线程时,虚拟机就会退出,者主要因为守护线程没有的服务的线程了,自己运行也没有什么必要了。
将一般线程变成守护的方法是setDaemon()。
例如:
Thread thread = new Tread();
thread.serDaemon(true);
thread.start();
需要的注意的是;线程必须在启动之前定义是否是守护线程,默认的情况下是 thread.setDaemon(false);
如果一个线程是守护线程而它的子类也是守护线程,这可以认为是一个线程的属性,子类是无法修改为非守护线程的,只能是守护线程。
接下来看一下应用:
守护线程完成数据维护的任务:监控一个队列,当数据超过10个时,删除队尾的2个数据。
/**
* 执行的删除数据
*/
import java.util.LinkedList;
public class Cleaner extends Thread {
volatile LinkedList
public Cleaner(LinkedList
this.list= list;
this.setDaemon(true);
}
public void run() {
while(true) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
removeData(list);
}
}
public void removeData(LinkedList
// System.out.println("-----------队列的数据数量-------"+list.size());
if(list.size()>10) {
for(int i=0;i<2;i++) {
synchronized (list) {
list.removeLast();
}
System.out.println("两个数据已经被被移除!");
}
}
}
}
/**
* 执行向对队列里面插入数据
*/
import java.util.LinkedList;
public class Worker extends Thread {
LinkedList
public Worker( LinkedList
this.list = list;
}
public void run() {
addListElement(list);
}
public void addListElement(LinkedList
int newData;
for(int i=0;i<1000000;i++) {
newData = (int)(Math.random()*1000000);
synchronized (list) {
list.addFirst(newData);
}
System.out.println("新的数据"+newData+"\t已经被加入到LinkedList队列");
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import java.util.LinkedList;
public class Index {
public static void main(String[] args) {
LinkedList
Thread worker1 = new Worker(list);
Thread worker2 = new Worker(list);
Thread cleaner = new Cleaner(list);
worker1.start();
worker2.start();
cleaner.start();
}
}
测试结果:
新的数据26567 已经被加入到LinkedList队列
新的数据206535 已经被加入到LinkedList队列
新的数据541409 已经被加入到LinkedList队列
新的数据34180 已经被加入到LinkedList队列
新的数据148986 已经被加入到LinkedList队列
新的数据329619 已经被加入到LinkedList队列
新的数据71179 已经被加入到LinkedList队列
新的数据320490 已经被加入到LinkedList队列
新的数据738252 已经被加入到LinkedList队列
新的数据23304 已经被加入到LinkedList队列
新的数据285954 已经被加入到LinkedList队列
新的数据203958 已经被加入到LinkedList队列
新的数据226334 已经被加入到LinkedList队列
两个数据已经被被移除!
两个数据已经被被移除!
新的数据986539 已经被加入到LinkedList队列
两个数据已经被被移除!
两个数据已经被被移除!
新的数据609143 已经被加入到LinkedList队列
新的数据924721 已经被加入到LinkedList队列
两个数据已经被被移除!
两个数据已经被被移除!
新的数据364307 已经被加入到LinkedList队列
新的数据368222 已经被加入到LinkedList队列
两个数据已经被被移除!
两个数据已经被被移除!