首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Daemon的施用

2012-10-11 
Daemon的使用后台线程是程序在运行的时候在后台提供一种通用服务的线程,当所有的非后台线程结束时,程序也

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();}}}
-----------执行结果如下:
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块的语句



热点排行