`

Daemon的使用

阅读更多
后台线程是程序在运行的时候在后台提供一种通用服务的线程,当所有的非后台线程结束时,程序也就终止,同时会杀死所有的后台线程。下面的例子很好的说明这一点:
public class SimpleDaemons implements Runnable{
	
	@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) {
				// TODO Auto-generated catch block
				e.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 block
			e.printStackTrace();
		}
	}

}

=========================================
如果一个线程被设置成了后台模式,这个线程派生出许多子线程,那么这些子线程也是后台线程,即便它们没有显示地设置成后台模式
public class DaemonSpawn implements Runnable{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true)
		{
			Thread.yield();
		}
	}

}
===========================
public class Daemon implements Runnable{
         //这里派生出10个子线程
	private Thread[] t=new Thread[10];
	
	@Override
	public void run() {//每次启动主线程时 10个子线程也将启动
		// TODO Auto-generated method stub
		for(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 block
			e.printStackTrace();
		}
	}
}
-----------执行结果如下:
d.isDaemon()=true
DaemonSpawn 0 started!
DaemonSpawn 1 started!
DaemonSpawn 2 started!
DaemonSpawn 3 started!
DaemonSpawn 4 started!
DaemonSpawn 5 started!
DaemonSpawn 6 started!
DaemonSpawn 7 started!
DaemonSpawn 8 started!
DaemonSpawn 9 started!
t[0].isDaemon=true
t[1].isDaemon=true
t[2].isDaemon=true
t[3].isDaemon=true
t[4].isDaemon=true
t[5].isDaemon=true
t[6].isDaemon=true
t[7].isDaemon=true
t[8].isDaemon=true
t[9].isDaemon=true



==========================
当主线程结束时,后台线程会立即结束,甚至可能不会执行finally字句的内容
class ADaemon implements Runnable{
   public void run(){
      try{
      print("XXXXXX");
      TimeUnit.SECONDS.sleep(1);
     }catch(Exception ex){
     }finally{
     print("finally...");
     }
   }
}
====在main函数里面直接测试这个线程,并设置为后台线程就不会执行finally块的语句



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics