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块的语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值