所谓后台(daemon)线程,是指程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有非后台线程。比如,执行main()的就是一个非后台线程。
可以通过setDaemon()方法在线程启动之前将线程设置为后台线程。
通过编写定制的ThreadFactory可以定制由Excecutor创建的线程的属性(后台、优先级、名称)。
class DaemonThreadFactory implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
// TODO Auto-generated method stub
Thread t=new Thread(r);
t.setDaemon(true);
return t;
}
}
public class DaemonFromFactory implements Runnable{
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ExecutorService exec=Executors.newCachedThreadPool(new DaemonThreadFactory());
for(int i=0;i<10;i++) {
exec.execute(new DaemonFromFactory());
}
System.out.println("All daemons started");
TimeUnit.MILLISECONDS.sleep(500);
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try{
TimeUnit.MILLISECONDS.sleep(100);
System.out.println(Thread.currentThread()+" "+this);
}catch(InterruptedException e) {
System.out.println("Interrupted");
}
}
}
}
其中让执行main()的非后台线程睡眠,使得可以在窗口上看到后台线程启动的效果,若不让执行main()的非后台线程睡眠,那么就只会看到后台线程创建完成的效果。将其中执行main()的非后台线程的睡眠时间调制更长时间,将会看到更长的后台线程运行轨迹,若将其睡眠时间调整至足够小的时间,那么也会看不到后台线程的执行轨迹。
可以通过调用isDaemon()方法判断一个线程是否为一个后台线程。
如果是一个后台线程,那么它创建的所有线程都将被自动设置为后台线程。