Daemon的使用
后台线程是程序在运行的时候在后台提供一种通用服务的线程,当所有的非后台线程结束时,程序也就终止,同时会杀死所有的后台线程。下面的例子很好的说明这一点:
public class SimpleDaemons implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){try {TimeUnit.MILLISECONDS.sleep(100);System.out.println(Thread.currentThread()+" "+this);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static void main(String[] args){for(int i=0;i<10;i++){Thread deamon=new Thread(new SimpleDaemons());deamon.setDaemon(true); //注意这个地方一定要放在线程启动之前设置,否则会抛出异常java.lang.IllegalThreadStateException,并且不会起作用//即便是这里启动了10个线程,且每个线程都是一个死循环,但是这10个都是后台线程,主线程的运行时间却很短,所以后台线程很快也会结束,不会一直执行deamon.start();}System.out.println("SimpleDaemons.main()");try {TimeUnit.MILLISECONDS.sleep(175);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public class DaemonSpawn implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){Thread.yield();}}}===========================public class Daemon implements Runnable{ //这里派生出10个子线程private Thread[] t=new Thread[10];@Overridepublic void run() {//每次启动主线程时 10个子线程也将启动// TODO Auto-generated method stubfor(int i=0;i<10;i++){t[i]=new Thread(new DaemonSpawn());t[i].start();System.out.println("DaemonSpawn "+i+" started!");}for(int i=0;i<t.length;i++){ System.out.println("t["+i+"].isDaemon="+t[i].isDaemon());//判断县城是否为后台线程}while(true){Thread.yield();}}}================public class Daemons {public static void main(String[] args){Thread d=new Thread(new Daemon());d.setDaemon(true);d.start();System.out.println("d.isDaemon()="+d.isDaemon());try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}-----------执行结果如下:class ADaemon implements Runnable{ public void run(){ try{ print("XXXXXX"); TimeUnit.SECONDS.sleep(1); }catch(Exception ex){ }finally{ print("finally..."); } }}====在main函数里面直接测试这个线程,并设置为后台线程就不会执行finally块的语句