Java中的守护线程Daemon Thread

Java中的线程分为用户线程User Thread和守护线程Daemon Thread;

一个线程调用void setDaemon(boolean on) 方法可以将自己设置成一个守护线程,例如:

 Thread.setDaemon(true);

线程默认是非守护线程,也称用户线程。

当程序中的所有用户线程都已结束运行时,即使守护线程的run()方法中还有需要执行的语句,守护线程也立刻结束运行。因为没有需要被守护者,守护者没有存在的意义了。可以用守护线程做一些不是很严格的工作,线程的随时结束不会产生什么不良的后果。一个线程必须在运行之前设置自己是否是守护线程。

下面是关于一个守护线程的例子,比较当线程B是守护线程时和非守护线程时的区别

public class DaemonThread {
	public static void main(String args[]) {
		Daemon a = new Daemon();
		a.A.start();
		a.B.setDaemon(true);
		a.B.start();
		
	}
}
class Daemon implements Runnable {
	Thread A,B;
	Daemon() {
		A = new Thread(this);
		B = new Thread(this);
	}
	public void run() {
		if(Thread.currentThread()==A) {
			for(int i=0;i<8;i++) {
				System.out.println("i="+i);
				try { 
					Thread.sleep(1000);
				} catch(InterruptedException e) {
					
				}
			}
		}
		else if(Thread.currentThread()==B) {
			while(true) {
				System.out.println("线程B是守护线程");
				try {
					Thread.sleep(1000);				
				}catch(InterruptedException e) {}
			}
		}
	}
}

运行结果为

i=0
线程B是守护线程
线程B是守护线程
i=1
线程B是守护线程
i=2
线程B是守护线程
i=3
线程B是守护线程
i=4
线程B是守护线程
i=5
线程B是守护线程
i=6
线程B是守护线程
i=7
线程B是守护线程


当B为非守护线程时,运行结果为

线程B不是守护线程
i=0
线程B不是守护线程
i=1
线程B不是守护线程
i=2
线程B不是守护线程
i=3
线程B不是守护线程
i=4
线程B不是守护线程
i=5
线程B不是守护线程
i=6
线程B不是守护线程
i=7
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程
线程B不是守护线程

.........

执行完线程A后 线程B无限执行下去。



作者:zhuhao717

微博:http://weibo.com/336765659

博客:http://blog.csdn.net/zhuhao717(转载请说明出处)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值