用户线程与守护线程

1、定义

用户线程:在Java程序中创建的一个线程就是用户线程

守护线程也称为服务线程,用于为系统中的其它对象和线程提供服务的。比如用于垃圾回收的垃圾回收线程。这类线程并不是用户线程不可或缺的部分,只是用于提供服务的"服务线程"。基于这个特点,当虚拟机中的用户线程全部退出运行时,守护线程没有服务的对象后,JVM也就退出了。

2、区别

1)如果用户线程已经全部退出运行了,只剩下守护线程,虚拟机也会退出。

2)守护线程创建的子线程也是守护线程。

3、将用户线程设置为守护线程的方法

      thread.setDaemon(true)

注意:thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。

4、实例

1)垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

2)编写一个CommonThread(用户线程)和DaemonThread(守护线程)

public class DaemonTest
{
	public static void main(String[] args)
	{
      DaemonThread dt=new DaemonThread();
      CommonThread ct=new CommonThread();
      Thread thread=new Thread(dt);
      Thread thread2=new Thread(ct);
      thread2.start();
      thread.setDaemon(true);
      thread.start();
	}
}


class CommonThread implements Runnable
{

	@Override
	public void run()
	{
		// TODO Auto-generated method stub
		for (int i = 0; i < 3; i++) {
			System.out.println("CommonThread:" + i);
		}

	}

}
class DaemonThread implements Runnable
{

	@Override
	public void run()
	{
		// TODO Auto-generated method stub
		for (int i = 0; i < 10; i++) {
			System.out.println("DaemonThread:" + i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

}
执行结果之一:



用户线程执行完毕之后,JVM退出。整个进程结束。

从上分析的得出:1)不是所有的线程都可以设为守护线程,比如逻辑运算和读写操作

          2)用户线程执行完毕之后,JVM就退出

         3)要在start()方法之前设置setDaemon(true)

参考链接:http://blog.csdn.net/shimiso/article/details/8964414






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值